Commit Graph

1045 Commits

Author SHA1 Message Date
sforman 0a1b150eb5 Working on the docs.
The nbconvert tool has different behaviour now, so the HTML versions of
the notebooks look different.
2023-07-27 08:55:43 -07:00
sforman 9ca9239738 Minor work on the new site.
I'm moving away from OSDN, there have been a few technical issues
recently.
2023-07-26 20:47:57 -07:00
sforman ae9da29921 Bold. 2023-07-26 16:34:03 -07:00
sforman 33fe5c688b Minor edits. 2023-07-26 16:32:30 -07:00
sforman 3f9f558ebb the BinInt zero vanished? 2023-07-25 22:01:55 -07:00
sforman bc5af441dc Minor edits. 2023-07-25 21:46:36 -07:00
sforman ced691279a Working on README, put defs in joy.py
I'm on an Ubuntu system right now and the split command doesn't have the
'-p' switch.  :(   I wasn't happy with that janky solution anyway.
2023-07-25 21:13:35 -07:00
sforman 975924f632 minor edits 2023-07-25 20:03:11 -07:00
sforman 18b5d5b497 Minor edits. 2023-07-25 10:04:45 -07:00
sforman f2688e311f Messing around with GNU Prolog.
I have it broken up into three stages: a parser that reads a string from
stdin and emits (Prolog) AST to stdout; an interpreter of sorts that
reads AST from stdin, evaluates it, and then emits the AST of the stack
on stdout; and a printer that reads AST on stdin and prints Joy-ish code
to stdout.

I say Joy-ish because currently math is not evaluated and results of
math appear as expressions, not values.

This is because GNU Prolog doesn't have unbounded integers (it's numbers
are machine integers) so literals that are larger than the machine word
are converted into atoms!  To keep things simple, I made all ints into
atoms, but then you can't evaluate them: '1'+'2' is not '3' (it might be
'12' though.)

So I print them out at expressions:

    $ echo "1 2 3 4 [+ sub /] i" | ./joy_to_ast | ./thun | ./printer

    (1 div (2-(4+3)))

You could almost feed that to, say, Python to evaluate, eh? Or dc with
proper formatting?  (man dc; "Desk Calculator".)

Anyway, it's a start.  The Prolog interpreter is more for things like
type checking and inference, optimizing, compiling, etc.  Symbolic stuff
that's a PITA to express in other languages.  (The old type inference
code in Python was pages long, in Prolog it's just the thun/3 & thun/4
predicates themselves.  At least so far.  There are things we will want
to do eventually that might be a PITA to express in Prolog, eh?
2023-07-25 08:51:27 -07:00
sforman a34a2b1aab Compile on Ubuntu. 2023-07-24 11:29:39 -07:00
sforman 0fa617766f Make it compatible with Xerblin. 2023-07-24 11:29:06 -07:00
sforman 7cd5943d89 Minor edits. 2023-07-24 11:28:45 -07:00
Simon Forman f844dbab6c Minor cleanup. 2023-03-22 14:45:54 -07:00
Simon Forman 23d6fe727e i combinator.
On a lark I implemented it in recursive style, but I'm not going to keep
it that way.  I have to implement next_term() first and then I'll
uncomment i_joy_combinator().
2023-03-22 11:54:17 -07:00
Simon Forman 34798b7f33 concat 2023-03-22 08:41:09 -07:00
Simon Forman e83745e6ec cons 2023-03-21 12:34:28 -07:00
Simon Forman f8016a84e3 minor cleanup 2023-03-21 09:38:50 -07:00
Simon Forman 2841e53d4d first 2023-03-21 09:33:20 -07:00
Simon Forman f2fe704ba6 rest 2023-03-21 09:27:00 -07:00
Simon Forman 8986b8c619 rest CANNOT_TAKE_REST_OF_EMPTY_LIST 2023-03-21 09:19:12 -07:00
Simon Forman 242c98edc4 swap 2023-03-20 16:33:11 -07:00
Simon Forman 290dec513d Check for error after cons'ing term. 2023-03-18 14:13:51 -07:00
Simon Forman 142f17fd37 pop_any() 2023-03-18 12:48:59 -07:00
Simon Forman 83a5bc46df dup 2023-03-18 12:43:30 -07:00
Simon Forman 1600fa210c stack function. 2023-03-18 12:31:36 -07:00
Simon Forman fcdf8d416a pop() 2023-03-18 11:50:18 -07:00
Simon Forman 75ba7db666 Move pop_list(). 2023-03-18 11:41:16 -07:00
Simon Forman 8682135380 No reason to pass expression to function. 2023-03-18 11:40:19 -07:00
Simon Forman 13d9d83383 pop_list()
Kind of a misnomer, you have to take the tail() of the stack yourself.
This function only returns the list from TOS.
2023-03-18 11:31:38 -07:00
Simon Forman d735d00016 Minor cleanup. 2023-03-18 11:31:12 -07:00
Simon Forman e39b9460bb Swaack and error macro. 2023-03-18 11:26:27 -07:00
Simon Forman 61039475a5 Use clear, set up for swaack. 2023-03-18 10:40:49 -07:00
Simon Forman 41438d10d9 Clear. 2023-03-17 12:10:18 -07:00
Simon Forman c9e620c281 Did i not commit this? 2023-03-10 14:11:54 -08:00
Simon Forman 7bfcdd2758 A start on the joy() interpeter. 2023-03-05 23:20:37 -08:00
Simon Forman c8360c7f7a Minor cleanup. 2023-03-05 23:04:56 -08:00
Simon Forman be214ce2b5 Catch unbalanced brackets. 2023-03-05 19:37:15 -08:00
Simon Forman 14e1b9728c Minor cleanup. 2023-03-05 19:26:34 -08:00
Simon Forman 65a2787630 Only allocate strings once.
That for loop in hash_fragment() is the gnarliest I've ever written.
2023-03-05 18:46:05 -08:00
Simon Forman 1a4be19f41 Combine tokenizer and parser.
I'm pretty happy with this. It's iterative rather than recursive so you
won't blow out the call stack if you want to parse a million brackets
(intermediate results are stored on (another) little stack.)  It scans
the string and builds lists and sublists as it goes, without wasting
cons cells.
2023-03-05 17:01:25 -08:00
Simon Forman bf3ba98d72 Thread error handling through tokenizer. 2023-03-05 15:20:22 -08:00
Simon Forman 0af1a9f7b5 It turns out the error machinery was working...
So I was memset'ing the hash table and string table /after/ setting up
the left- and right-bracket tokens! So then when I tried to print the
token list and ht_lookup() dutifully set the error code when it couldn't
find the strings in the hash table, the system properly quit printing
and halted.  D'oh!  That was a subtle one.  Obvious in hindsight.
2023-03-05 14:36:55 -08:00
Simon Forman 0a9cdba456 Fold parser code into joy_types.c
Add some docs, minor cleanup.
2023-03-04 20:50:34 -08:00
Simon Forman 87aef6f06d It seems to be working.
It took all expletive-deleted day but I finally nailed it down.  In the
end the last bug was I was decrementing a stack pointer /after/ trying
to load the item at the (empty) top of the stack.  Classic.

I still need to make it not re-allocate strings that it has already
interned, but beyond that I think it's fine.
2023-03-04 17:48:26 -08:00
Simon Forman 9cde4ed73d tokenate() and reverse_list_in_place() 2023-03-04 17:23:54 -08:00
Simon Forman dfd8f86e7b Use symbols for tokens for brackets.
Try a different tack on the parser.
2023-03-04 15:48:55 -08:00
Simon Forman 8b1db4bea7 Almost working parser. 2023-03-04 11:59:19 -08:00
Simon Forman 5ee30a70f9 Minor cleanup.
Some printing to see the machinery in action.
2023-03-04 08:31:40 -08:00
Simon Forman fc5992c23b Joy parser in NCC. 2023-03-04 08:25:32 -08:00