Commit Graph

1035 Commits

Author SHA1 Message Date
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
Simon Forman cf37e52550 A start on error handling. 2023-03-03 19:23:15 -08:00
Simon Forman 7284a7fcf3 Double hashing w/ extra bits of hash. 2023-03-03 14:52:26 -08:00
Simon Forman d8571d2063 A start on a hash table for symbols. 2023-03-03 12:05:40 -08:00
Simon Forman fd2ba3b67d Joy in UVM NCC code. 2023-03-03 07:31:52 -08:00
Simon Forman 5b6185209a A bunch of stuff. 2023-03-03 07:30:55 -08:00
Simon Forman f87ddbfa9e Minor cleanup. 2023-02-28 07:45:38 -08:00
Simon Forman 5423e0b239 Use defines to abstract font choice.
Clunky but now you only have to change the font name four time in one
place rather than N times in N places, eh?

Writing C again for the first time in ages (this and the Joy
interpreter) the using the preprocessor is like stone-age
meta-programming, from the lens of lisp it's like, "you do what to your
source code?".
2023-02-28 07:14:33 -08:00
Simon Forman 144e73ebc3 A different font.
It's easy enough to substitute a different font in the call to
Imagemagick's `convert` tool, but in the case of pixel fonts, it will
scale them, so you're not getting a proper bitmap of the pixels, you're
getting a kind of screenshot of the pixels.

I want to make a different machinery for bitmapped pixel fonts, and I
want to make a simple DEFINE-based way to pick them without having to
edit your source code,  e.g. #define font_data font_PublicPixel_22_data
yeah?

After that, simple affine transforms for fake 3D..
2023-02-28 06:53:31 -08:00
Simon Forman 58f779c430 Wu-ish lines. 2023-02-27 19:27:32 -08:00
Simon Forman 300cf2f24d Mostly working Wu-ish algorithm. 2023-02-27 16:29:45 -08:00