OSDN Git Service
sforman [Sat, 29 Jul 2023 18:07:50 +0000 (11:07 -0700)]
Comparison ops.
sforman [Sat, 29 Jul 2023 17:44:51 +0000 (10:44 -0700)]
loop
sforman [Sat, 29 Jul 2023 17:38:12 +0000 (10:38 -0700)]
branch
sforman [Sat, 29 Jul 2023 17:28:31 +0000 (10:28 -0700)]
dip
sforman [Sat, 29 Jul 2023 17:23:06 +0000 (10:23 -0700)]
i
sforman [Sat, 29 Jul 2023 17:19:39 +0000 (10:19 -0700)]
truthy
I have to check into this: the Python version has "bool" and no
"truthy".
sforman [Sat, 29 Jul 2023 17:09:40 +0000 (10:09 -0700)]
swap
sforman [Sat, 29 Jul 2023 17:00:16 +0000 (10:00 -0700)]
stack, swaack
sforman [Sat, 29 Jul 2023 16:55:28 +0000 (09:55 -0700)]
pop
sforman [Sat, 29 Jul 2023 16:53:00 +0000 (09:53 -0700)]
first, rest
sforman [Sat, 29 Jul 2023 16:22:26 +0000 (09:22 -0700)]
dup
sforman [Sat, 29 Jul 2023 16:17:27 +0000 (09:17 -0700)]
cons
sforman [Sat, 29 Jul 2023 16:06:14 +0000 (09:06 -0700)]
clear, concat
sforman [Sat, 29 Jul 2023 15:57:58 +0000 (08:57 -0700)]
Minor cleanup.
sforman [Sat, 29 Jul 2023 15:49:31 +0000 (08:49 -0700)]
Type alias JList
sforman [Sat, 29 Jul 2023 14:51:31 +0000 (07:51 -0700)]
Refactor pop_int.
I don't like passing the stack through isnt_int but that let's you chain
with andThen.
There's probably a clever or idiomatic way to not do that and couple the
stack to the result without passing it through the type checker function
but I don't know what it is right now, and this works.
sforman [Sat, 29 Jul 2023 14:32:56 +0000 (07:32 -0700)]
Binary Math Ops
sforman [Sat, 29 Jul 2023 14:19:08 +0000 (07:19 -0700)]
I don't think andThen helps here?
sforman [Sat, 29 Jul 2023 13:54:15 +0000 (06:54 -0700)]
I can add integers!
sforman [Sat, 29 Jul 2023 04:51:34 +0000 (21:51 -0700)]
Parsing working.
Modeled on the OCaml code.
sforman [Fri, 28 Jul 2023 22:04:35 +0000 (15:04 -0700)]
A start on Joy types.
sforman [Fri, 28 Jul 2023 21:18:12 +0000 (14:18 -0700)]
In Elm.
sforman [Thu, 27 Jul 2023 17:32:45 +0000 (10:32 -0700)]
Use Python as SHELL in Makefile.
It's a simple task, but I'm not up on my CLI tools, so I went with
Python instead of sh. The split command doesn't have '-p' switch on
Ubuntu. (I'm using Ubuntu on this laptop because it can correctly
configure the WiFi and the laptop has no ethernet port.)
sforman [Thu, 27 Jul 2023 16:55:26 +0000 (09:55 -0700)]
minor cleanup
sforman [Thu, 27 Jul 2023 16:55:02 +0000 (09:55 -0700)]
minor cleanup
sforman [Thu, 27 Jul 2023 16:19:12 +0000 (09:19 -0700)]
Rename joy_to_ast to parser.
sforman [Thu, 27 Jul 2023 15:55:43 +0000 (08:55 -0700)]
Working on the docs.
The nbconvert tool has different behaviour now, so the HTML versions of
the notebooks look different.
sforman [Thu, 27 Jul 2023 03:47:57 +0000 (20:47 -0700)]
Minor work on the new site.
I'm moving away from OSDN, there have been a few technical issues
recently.
sforman [Wed, 26 Jul 2023 23:34:03 +0000 (16:34 -0700)]
Bold.
sforman [Wed, 26 Jul 2023 23:32:30 +0000 (16:32 -0700)]
Minor edits.
sforman [Wed, 26 Jul 2023 05:01:55 +0000 (22:01 -0700)]
the BinInt zero vanished?
sforman [Wed, 26 Jul 2023 04:46:36 +0000 (21:46 -0700)]
Minor edits.
sforman [Wed, 26 Jul 2023 04:13:35 +0000 (21:13 -0700)]
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.
sforman [Wed, 26 Jul 2023 03:03:11 +0000 (20:03 -0700)]
minor edits
sforman [Tue, 25 Jul 2023 17:04:45 +0000 (10:04 -0700)]
Minor edits.
sforman [Tue, 25 Jul 2023 15:51:27 +0000 (08:51 -0700)]
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?
sforman [Mon, 24 Jul 2023 18:29:39 +0000 (11:29 -0700)]
Compile on Ubuntu.
sforman [Mon, 24 Jul 2023 18:29:06 +0000 (11:29 -0700)]
Make it compatible with Xerblin.
sforman [Mon, 24 Jul 2023 18:28:45 +0000 (11:28 -0700)]
Minor edits.
Simon Forman [Wed, 22 Mar 2023 21:45:54 +0000 (14:45 -0700)]
Minor cleanup.
Simon Forman [Wed, 22 Mar 2023 18:54:17 +0000 (11:54 -0700)]
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().
Simon Forman [Wed, 22 Mar 2023 15:41:09 +0000 (08:41 -0700)]
concat
Simon Forman [Tue, 21 Mar 2023 19:34:28 +0000 (12:34 -0700)]
cons
Simon Forman [Tue, 21 Mar 2023 16:38:50 +0000 (09:38 -0700)]
minor cleanup
Simon Forman [Tue, 21 Mar 2023 16:33:20 +0000 (09:33 -0700)]
first
Simon Forman [Tue, 21 Mar 2023 16:27:00 +0000 (09:27 -0700)]
rest
Simon Forman [Tue, 21 Mar 2023 16:19:12 +0000 (09:19 -0700)]
rest CANNOT_TAKE_REST_OF_EMPTY_LIST
Simon Forman [Mon, 20 Mar 2023 23:33:11 +0000 (16:33 -0700)]
swap
Simon Forman [Sat, 18 Mar 2023 21:13:51 +0000 (14:13 -0700)]
Check for error after cons'ing term.
Simon Forman [Sat, 18 Mar 2023 19:48:59 +0000 (12:48 -0700)]
pop_any()
Simon Forman [Sat, 18 Mar 2023 19:43:30 +0000 (12:43 -0700)]
dup
Simon Forman [Sat, 18 Mar 2023 19:31:36 +0000 (12:31 -0700)]
stack function.
Simon Forman [Sat, 18 Mar 2023 18:50:18 +0000 (11:50 -0700)]
pop()
Simon Forman [Sat, 18 Mar 2023 18:41:16 +0000 (11:41 -0700)]
Move pop_list().
Simon Forman [Sat, 18 Mar 2023 18:40:19 +0000 (11:40 -0700)]
No reason to pass expression to function.
Simon Forman [Sat, 18 Mar 2023 18:31:38 +0000 (11:31 -0700)]
pop_list()
Kind of a misnomer, you have to take the tail() of the stack yourself.
This function only returns the list from TOS.
Simon Forman [Sat, 18 Mar 2023 18:31:12 +0000 (11:31 -0700)]
Minor cleanup.
Simon Forman [Sat, 18 Mar 2023 18:26:27 +0000 (11:26 -0700)]
Swaack and error macro.
Simon Forman [Sat, 18 Mar 2023 17:40:49 +0000 (10:40 -0700)]
Use clear, set up for swaack.
Simon Forman [Fri, 17 Mar 2023 19:10:18 +0000 (12:10 -0700)]
Clear.
Simon Forman [Fri, 10 Mar 2023 22:11:54 +0000 (14:11 -0800)]
Did i not commit this?
Simon Forman [Mon, 6 Mar 2023 07:20:37 +0000 (23:20 -0800)]
A start on the joy() interpeter.
Simon Forman [Mon, 6 Mar 2023 07:04:56 +0000 (23:04 -0800)]
Minor cleanup.
Simon Forman [Mon, 6 Mar 2023 03:37:15 +0000 (19:37 -0800)]
Catch unbalanced brackets.
Simon Forman [Mon, 6 Mar 2023 03:26:34 +0000 (19:26 -0800)]
Minor cleanup.
Simon Forman [Mon, 6 Mar 2023 02:46:05 +0000 (18:46 -0800)]
Only allocate strings once.
That for loop in hash_fragment() is the gnarliest I've ever written.
Simon Forman [Mon, 6 Mar 2023 01:01:25 +0000 (17:01 -0800)]
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.
Simon Forman [Sun, 5 Mar 2023 23:20:22 +0000 (15:20 -0800)]
Thread error handling through tokenizer.
Simon Forman [Sun, 5 Mar 2023 22:36:55 +0000 (14:36 -0800)]
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.
Simon Forman [Sun, 5 Mar 2023 04:50:34 +0000 (20:50 -0800)]
Fold parser code into joy_types.c
Add some docs, minor cleanup.
Simon Forman [Sun, 5 Mar 2023 01:48:26 +0000 (17:48 -0800)]
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.
Simon Forman [Sun, 5 Mar 2023 01:23:54 +0000 (17:23 -0800)]
tokenate() and reverse_list_in_place()
Simon Forman [Sat, 4 Mar 2023 23:48:55 +0000 (15:48 -0800)]
Use symbols for tokens for brackets.
Try a different tack on the parser.
Simon Forman [Sat, 4 Mar 2023 19:59:19 +0000 (11:59 -0800)]
Almost working parser.
Simon Forman [Sat, 4 Mar 2023 16:31:40 +0000 (08:31 -0800)]
Minor cleanup.
Some printing to see the machinery in action.
Simon Forman [Sat, 4 Mar 2023 16:25:32 +0000 (08:25 -0800)]
Joy parser in NCC.
Simon Forman [Sat, 4 Mar 2023 03:23:15 +0000 (19:23 -0800)]
A start on error handling.
Simon Forman [Fri, 3 Mar 2023 22:52:26 +0000 (14:52 -0800)]
Double hashing w/ extra bits of hash.
Simon Forman [Fri, 3 Mar 2023 20:05:40 +0000 (12:05 -0800)]
A start on a hash table for symbols.
Simon Forman [Fri, 3 Mar 2023 15:31:52 +0000 (07:31 -0800)]
Joy in UVM NCC code.
Simon Forman [Fri, 3 Mar 2023 15:30:55 +0000 (07:30 -0800)]
A bunch of stuff.
Simon Forman [Tue, 28 Feb 2023 15:45:38 +0000 (07:45 -0800)]
Minor cleanup.
Simon Forman [Tue, 28 Feb 2023 15:14:33 +0000 (07:14 -0800)]
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?".
Simon Forman [Tue, 28 Feb 2023 14:53:31 +0000 (06:53 -0800)]
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..
Simon Forman [Tue, 28 Feb 2023 03:27:32 +0000 (19:27 -0800)]
Wu-ish lines.
Simon Forman [Tue, 28 Feb 2023 00:29:45 +0000 (16:29 -0800)]
Mostly working Wu-ish algorithm.
Simon Forman [Mon, 27 Feb 2023 05:46:05 +0000 (21:46 -0800)]
Minor cleanup.
Simon Forman [Mon, 27 Feb 2023 05:02:57 +0000 (21:02 -0800)]
Cicada bg, needs work.
Not as pretty as I'd hoped.
Putting a pin in Wu lines for tonight. I'll lick it in the morning when
I'm fresh.
Simon Forman [Mon, 27 Feb 2023 04:39:32 +0000 (20:39 -0800)]
I clearly don't know what I'm doing.
Go to sleep! Think, then type!
Simon Forman [Mon, 27 Feb 2023 04:02:14 +0000 (20:02 -0800)]
Is this fun? Kinda.
I should break out the graph papaer and Abrash's Black Book and figure
out WTF I'm doing rather than just noodling around, eh?
Simon Forman [Mon, 27 Feb 2023 03:06:15 +0000 (19:06 -0800)]
Horizontal proto-Wu.
Simon Forman [Mon, 27 Feb 2023 02:07:47 +0000 (18:07 -0800)]
Horz/vert lines and boxes.
Simon Forman [Mon, 27 Feb 2023 00:55:53 +0000 (16:55 -0800)]
Aw, exit() doesn't work?
In any event, I can live with esc-to-quit (is there a callback to hook
into?)
Simon Forman [Mon, 27 Feb 2023 00:53:41 +0000 (16:53 -0800)]
But KEY_BACKSPACE doesn't seem to fire?
Maybe worth a bug report?
Simon Forman [Mon, 27 Feb 2023 00:52:02 +0000 (16:52 -0800)]
Ha ha! The escape-to-quit behavior...
...seems to be baked into the UVM.
Simon Forman [Mon, 27 Feb 2023 00:49:11 +0000 (16:49 -0800)]
Add if..else ladder for keys.
I just noticed that I have KEY_BACKSPACE for the exit key rather than
KEY_ESCAPE as I had thought, yet escape key surely does exit the
program!
Simon Forman [Mon, 27 Feb 2023 00:27:23 +0000 (16:27 -0800)]
Escape key exits program.
Simon Forman [Mon, 27 Feb 2023 00:04:54 +0000 (16:04 -0800)]
minor edits
I don't think this is any better?
Simon Forman [Sun, 26 Feb 2023 23:24:40 +0000 (15:24 -0800)]
Draw chars when you click.
Pick a letter at random.
I wasn't checking that the destination values were not less than zero,
which let you click at the top/left edges of the screen and therefore
the carefree_alpha_blend_blit() would try to write to areas outside the
framebuffer. I started to see "zalgol" pixels in the letters, so I'm
guessing the pixel data is getting stored just above the framebuffer,
which makes sense (because that's the order they appear in the source
code and this is a simple system!) When you click at the top of the
screen it was writing pixels in the font data, eh? Then when you click
elsewhere on the screen you get extra pixels with your letterforms and
it looks like Unicode Lovecraft puns.
Simon Forman [Sun, 26 Feb 2023 23:06:30 +0000 (15:06 -0800)]
A sort of blit.