Commit Graph

437 Commits

Author SHA1 Message Date
Simon Forman 42068ebcb6 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?
2023-02-26 20:02:14 -08:00
Simon Forman 66d687bba6 Horizontal proto-Wu. 2023-02-26 19:06:15 -08:00
Simon Forman d8e20c0ce9 Horz/vert lines and boxes. 2023-02-26 18:07:47 -08:00
Simon Forman c385ad096b Aw, exit() doesn't work?
In any event, I can live with esc-to-quit (is there a callback to hook
into?)
2023-02-26 16:55:53 -08:00
Simon Forman e18eb36c52 But KEY_BACKSPACE doesn't seem to fire?
Maybe worth a bug report?
2023-02-26 16:53:41 -08:00
Simon Forman 50e34c70cb Ha ha! The escape-to-quit behavior...
...seems to be baked into the UVM.
2023-02-26 16:52:02 -08:00
Simon Forman f8f27ed83e 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!
2023-02-26 16:49:11 -08:00
Simon Forman e1c81d2c1c Escape key exits program. 2023-02-26 16:27:23 -08:00
Simon Forman 14e15b08a1 minor edits
I don't think this is any better?
2023-02-26 16:04:54 -08:00
Simon Forman 2b07553aa1 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.
2023-02-26 15:24:40 -08:00
Simon Forman 9ca4f81325 A sort of blit. 2023-02-26 15:06:30 -08:00
Simon Forman d7db105bc8 Depend on graphics.h. 2023-02-26 13:24:34 -08:00
Simon Forman dbc2fe5854 Move draw_background to own file graphics.h. 2023-02-26 13:20:38 -08:00
Simon Forman 27385e5319 Switch font size to 22.
My old eyes ain't what they used to be.
2023-02-26 13:09:02 -08:00
Simon Forman f7b644d210 Minor cleanup. 2023-02-26 13:04:04 -08:00
Simon Forman 057743c473 Try changing the font size. 2023-02-26 12:42:39 -08:00
Simon Forman f403b6caa2 Display font in anti-aliased glory! 2023-02-26 11:23:32 -08:00
Simon Forman 84f163b71c Alpha blend font FTW! 2023-02-26 11:21:18 -08:00
Simon Forman 2680d8ce1b Okay, alright, skipping blank pixels. 2023-02-26 11:12:07 -08:00
Simon Forman 051b9a46b8 We have a character on the screen!
It looks like potato because no alpha blending yet, but it's certainly
there!  I don't like the spelling of the C code, but who cares?  It
works.
2023-02-26 11:07:29 -08:00
Simon Forman 5d01480f3d A start on draw_char(). 2023-02-26 10:52:09 -08:00
Simon Forman c886a27ddd Rename anim_callback to draw_background
because that's what it is
2023-02-26 10:18:46 -08:00
Simon Forman fc8920a09c i can haz font data
ooo that's a finicky parser tho

Early days.  It's all good.

(But damn those Rust tracebacks, what a useless pile of text.  i know
the problem is in the parser!?  why is it showing me all the rust
internal crap and none of the actual stack trace of the ncc code?  I
mean, look at this thing:

    sforman@bock:~/src/Joypy/implementations/uvm-ncc % setenv RUST_BACKTRACE full
    sforman@bock:~/src/Joypy/implementations/uvm-ncc % gmake
    cd /home/sforman/src/uvm/ncc ; cargo run /home/sforman/src/Joypy/implementations/uvm-ncc/xerblin.c
        Finished dev [unoptimized + debuginfo] target(s) in 0.01s
         Running `target/debug/ncc /home/sforman/src/Joypy/implementations/uvm-ncc/xerblin.c`
    thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: ParseError { msg: "expected identifier", line_no: 139, col_no: 20 }', src/main.rs:98:43
    stack backtrace:
       0:          0x10d741f - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h919bef3d5abebde9
       1:          0x10ee08e - core::fmt::write::h6413343c5226105f
       2:          0x10bce85 - std::io::Write::write_fmt::had0ddcb25461208f
       3:          0x10d71d5 - std::sys_common::backtrace::print::h5ed9962f90e9b258
       4:          0x10c6eff - std::panicking::default_hook::{{closure}}::h3978a8a8f5c1f893
       5:          0x10c6b91 - std::panicking::default_hook::h0cdbdd5201407347
       6:          0x10c75bb - std::panicking::rust_panic_with_hook::h15bc8b6da20c2af3
       7:          0x10d7777 - std::panicking::begin_panic_handler::{{closure}}::h082a693f9436206b
       8:          0x10d756c - std::sys_common::backtrace::__rust_end_short_backtrace::h56343aa2331ff455
       9:          0x10c7142 - rust_begin_unwind
      10:          0x10ed3d3 - core::panicking::panic_fmt::hf18d1d226927e137
      11:          0x10efa93 - core::result::unwrap_failed::ha5725a0b4539229c
      12:          0x105b505 - core::result::Result<T,E>::unwrap::h0f336a18a308049e
                                   at /wrkdirs/usr/ports/lang/rust/work/rustc-1.66.0-src/library/core/src/result.rs:1113:23
      13:          0x1068314 - ncc::main::h189929cbc5450262
                                   at /usr/home/sforman/src/uvm/ncc/src/main.rs:98:20
      14:          0x10611cb - core::ops::function::FnOnce::call_once::h8146a3c8fa28ca14
                                   at /wrkdirs/usr/ports/lang/rust/work/rustc-1.66.0-src/library/core/src/ops/function.rs:251:5
      15:          0x106e13e - std::sys_common::backtrace::__rust_begin_short_backtrace::h4e9f285841c55b79
                                   at /wrkdirs/usr/ports/lang/rust/work/rustc-1.66.0-src/library/std/src/sys_common/backtrace.rs:121:18
      16:          0x1069fa1 - std::rt::lang_start::{{closure}}::h8ca60a785648e691
                                   at /wrkdirs/usr/ports/lang/rust/work/rustc-1.66.0-src/library/std/src/rt.rs:166:18
      17:          0x10c1514 - std::rt::lang_start_internal::hadf3843363799440
      18:          0x1069f7a - std::rt::lang_start::h3ee6ffb894d9f1d3
                                   at /wrkdirs/usr/ports/lang/rust/work/rustc-1.66.0-src/library/std/src/rt.rs:165:17
      19:          0x10684ee - main
      20:          0x104f472 - _start
                                   at /usr/src/lib/csu/amd64/crt1.c:76:7
    gmake: *** [GNUmakefile:11: /home/sforman/src/uvm/ncc/out.asm] Error 101

There's ONE LINE from the ncc source: uvm/ncc/src/main.rs:98:20 which is a call
to parse_unit, but it's the following unwrap that seems to be causing the error
message?
2023-02-26 10:11:58 -08:00
Simon Forman 3d419a3330 This compiles. 2023-02-26 10:06:39 -08:00
Simon Forman 843654861b I think I got it. 2023-02-26 10:01:40 -08:00
Simon Forman 7a289db111 Adding a function and it still compiles. 2023-02-26 09:39:21 -08:00
Simon Forman f5f6233302 This compiles and runs, include font.h but don't call init_font_data() yet. 2023-02-26 09:37:59 -08:00
Simon Forman 8c5e9aa105 So far... 2023-02-26 09:37:20 -08:00
Simon Forman b013168679 Drawing pixel per mouse move is slow at 1280x800.
So let's just use a smaller screen for now, eh?
2023-02-26 08:52:53 -08:00
Simon Forman e047af09b3 Repair damage during mouse move.
This is a compromise between updating the screen every frame (which
takes ~60% CPU on my old no-GPU hardware) and repairing damage from e.g.
dragging offscreen and back on, or covering and uncovering the window
with another window.
2023-02-26 08:42:37 -08:00
Simon Forman eb67419327 Let's use uvm.
https://github.com/maximecb/uvm
2023-02-26 07:53:47 -08:00
Simon Forman 7485383d9f Allocate a buffer just large enough.
I figure that's worth the overhead of iterating twice.  It's happening
during a user interaction so there's plenty of time, eh?
2023-02-20 16:23:41 -08:00
Simon Forman eeb935fa07 Break up completion into simple and prefixed cases. 2023-02-20 16:04:12 -08:00
Simon Forman c0b582567a Handle completion of symbols with a prefix...
You can type stuff and then tab and it will work.  Before it would try
to complete the whole line, which didn't work.
2023-02-20 15:48:59 -08:00
Simon Forman 2d3c17c152 Linenoise with rax. 2023-02-20 12:53:58 -08:00
Simon Forman 7d93262c81 Let's use rax to generate tab completions? 2023-02-20 11:19:27 -08:00
Simon Forman b32a3f2496 Line editing with linenoise.
https://github.com/antirez/linenoise
https://todo.sr.ht/~sforman/thun-der/33
2023-02-20 10:20:40 -08:00
Simon Forman d8263e0527 Move and rename push_thing_onto_expression(). 2023-02-20 08:35:03 -08:00
Simon Forman d0a43bea52 Minor cleanup. 2023-02-20 06:38:18 -08:00
Simon Forman 83f393a176 typedef FTW 2023-02-19 20:06:07 -08:00
Simon Forman c35396cf73 Wrap it? 2023-02-19 19:43:53 -08:00
Simon Forman 98e3e91345 I figured out how to spell it. 2023-02-19 19:41:11 -08:00
Simon Forman 5258f4d894 A little macro. 2023-02-19 19:40:43 -08:00
Simon Forman f06c261e81 Let's use the idiomatic functions, eh?
That way the code is simpler and there aren't error messages scattered
all over the place.
2023-02-19 17:54:34 -08:00
Simon Forman f194df8159 How would you compile this?
fn [+] step
2023-02-19 17:43:18 -08:00
Simon Forman 7d99bb4e23 SWIProlog 2023-02-18 20:09:19 -08:00
Simon Forman a33bb8cdaa eval_joy_ast 2023-02-17 13:56:37 -08:00
Simon Forman 0d51f7ec1f A simple Joy-to-AST program.
Written in GNU Prolog, doncha know!?  :D
2023-02-17 11:08:43 -08:00
Simon Forman efbca82064 vlist.c 2023-02-17 11:07:32 -08:00
Simon Forman 10edbd0ee0 Used "Artistic Style" (astyle) to check formatting. 2023-02-15 17:22:14 -08:00
Simon Forman 1256fb47d8 A start on styling notebooks.
I'd like the website to have some consistency.
2023-02-15 13:43:22 -08:00
Simon Forman 610de03e0b Minor updates to README file.
Removed setup.py until Python folks stabilize packaging and
distribution.  Just put the joy script in your PATH, eh?
2023-02-15 10:05:25 -08:00
Simon Forman db9c2c16a9 inscribe command for Nim.
https://todo.sr.ht/~sforman/thun-der/27

It doesn't let you overwrite definitions that are loaded from defs.txt.
It DOES let you overwrite builtins, but that doesn't matter because they
are handled by joy_eval() before it checks the dictionary, so in
practice the definitions are never evaluated even though they are put
into the dictionary.  Whew!  It's hacky but it works!
2023-02-14 20:27:36 -08:00
Simon Forman 3d78f831cb Emit errors on stderr. 2023-02-14 18:48:49 -08:00
Simon Forman de774af3da Emit error messages on stderr. 2023-02-14 17:57:29 -08:00
Simon Forman db322b0b3b Emit error messages on stderr. 2023-02-14 17:52:52 -08:00
Simon Forman eca5e41cc9 Conform Python error messages. 2023-02-14 17:40:49 -08:00
Simon Forman 2f5f679d61 No negative shift values. 2023-02-14 14:56:46 -08:00
Simon Forman 23cf3f5b70 lshift and rshift for Nim.
Incomplete, should reject negative shift count.
2023-02-14 14:19:57 -08:00
Simon Forman c2eae95bb2 lshift and rshift for C. 2023-02-14 13:15:53 -08:00
Simon Forman f1db810370 or instead of ||, and instead of &&
Docs still TODO!
2023-02-14 12:27:46 -08:00
Simon Forman 8c36d8316e Hack to deal with trailing underscores. 2023-02-14 12:08:32 -08:00
Simon Forman 9c355166b6 Bring error message inline with other implementations. 2023-02-14 12:07:58 -08:00
Simon Forman 5ce30d41c3 Regularize defs.txt.
All three main interpreters use the same defs.txt file.
2023-02-14 10:23:23 -08:00
Simon Forman 2700ab8a7f Aliases for builtins in Python Joy. 2023-02-14 10:19:03 -08:00
Simon Forman 178e58f8bd Load embedded defs.txt, remove ≡ stuff.
I like that ≡ but I also like consistency.
2023-02-14 10:07:26 -08:00
Simon Forman 25c48e059b Splice defs.txt into joy.py to make "joy" script. 2023-02-14 09:52:01 -08:00
Simon Forman ae77bbda24 Move all the bigints code into own dir. 2023-02-14 08:48:08 -08:00
Simon Forman e771e0182b Make /\ and \/ check that their args are Booleans. 2023-02-14 08:40:32 -08:00
Simon Forman ad0f135376 Don't let defs shadow builtins. 2023-02-14 08:39:52 -08:00
Simon Forman f0c94aeed8 regularize defs.txt; new andies.
I made a crude facility in the C impl for excluding definitions that
would replace built-in commands.  This should be improved, eh?

I also started on renameing the logical Boolean ops
https://todo.sr.ht/~sforman/thun-der/29
2023-02-14 08:27:17 -08:00
Simon Forman f37ef42cb4 Note to self...
This bit of code works, but I'm not sure why, or even if it's just an
illusion of working, and here lurks a nasty bug?
2023-02-14 07:56:52 -08:00
Simon Forman e35ecea25e Unify the various defs.txt files...
Work in progress.  THis is broken now.
2023-02-14 07:55:09 -08:00
Simon Forman a828169b34 initialization/1 FTW! 2023-02-12 20:39:26 -08:00
Simon Forman 1540338306 Minor cleanup.
To the first serious Joy code: bigints!
2023-02-12 20:11:40 -08:00
Simon Forman b0d79f77f7 minor refactor 2023-02-12 19:19:51 -08:00
Simon Forman 5bccaff9f2 Conform!
cons and loop check type before number.
Don't print '<- top'.
2023-02-12 18:45:56 -08:00
Simon Forman aacd9764fe Make Python and C interpreters conform.
The Python one still checks number before type with get_n_items().
I can live with that for now.
2023-02-12 16:17:27 -08:00
Simon Forman eb38a7e817 fdiv
This is why you compile and run tests /before/ you commit changes, eh?
2023-02-12 16:04:37 -08:00
Simon Forman b6d4175a78 Bring behaviour inline with joytest.
Pop has it's own error message.

Div should be "floor" division

> fdiv rounds q down towards -infinity, and r will have the same sign as
> d. The f stands for “floor”.

https://gmplib.org/manual/Integer-Division
2023-02-12 16:01:19 -08:00
Simon Forman 51b32bbc0a Quiet mode for C. 2023-02-12 15:15:01 -08:00
Simon Forman 6f3b942ded Build manifest for sr.ht. 2023-02-10 08:10:47 -08:00
Simon Forman 75591f36ba minor cleanup 2023-02-10 08:09:31 -08:00
Simon Forman acfa19239e null, small
https://todo.sr.ht/~sforman/thun-der/23
2023-02-09 10:58:08 -08:00
Simon Forman 035fb00939 minor cleanup 2023-02-09 08:28:31 -08:00
Simon Forman 101a0241d3 and, or (Boolean ops).
"not not" serves as a kind of type-checking identity function. "not"
will error out on non-Boolean values, or the absence of a second arg.
2023-02-09 07:52:50 -08:00
Simon Forman 66f47f8e36 divmod, xor 2023-02-09 06:59:39 -08:00
Simon Forman 8016fd697a Allow for redefinition of user defs.
And some protection for inscribe, empty quotes or quotes that do not
have a symbol at the first item are just consumed without affecting the
user defs.

Because the Gperf wordlist is checked before the user defs hash the
inscribe command cannot overwrite the commands defined in the wordlist.
2023-02-08 23:20:35 -08:00
Simon Forman 35d8ed498f User definitions with the inscribe command.
Using uthash http://troydhanson.github.io/uthash/index.html
2023-02-08 21:13:23 -08:00
Simon Forman b1d7a34eab unstack 2023-02-08 15:06:12 -08:00
Simon Forman 2be2d00e6b Handle definitions with non-alphanumeric chars in their names. 2023-02-08 12:50:23 -08:00
Simon Forman 832cbe34e4 Oh, LDFLAGS, right... 2023-02-08 11:55:33 -08:00
Simon Forman 2b54c0bc0a Initializers for Boolean values. 2023-02-07 20:53:44 -08:00
Simon Forman 94bcd2aa51 Minor cleanup. 2023-02-07 20:47:32 -08:00
Simon Forman efd77a2ffd Aliases can be put in KEYWORDS.in
This avoids the overhead of single-functions definitions for aliases.
2023-02-07 19:14:37 -08:00
Simon Forman 0c8e49d591 dispatch 2023-02-07 17:44:32 -08:00
Simon Forman b57cfdf825 Track KEYWORDS.txt after all. 2023-02-06 13:14:14 -08:00
Simon Forman 708e5ad3f5 eq, neq, gt, ge, lt, le 2023-02-06 13:09:37 -08:00
Simon Forman 05575d8a08 A bunch of definitions.
Still to do: the comparison functions.
2023-02-06 12:59:39 -08:00
Simon Forman 437e0af91d Use setjmp/longjmp to recover after errors.
Wow!  That was easy!
2023-02-06 00:30:25 -08:00
Simon Forman 0611aa3c05 Clean KEYWORDS.txt too. 2023-02-05 20:48:19 -08:00
Simon Forman 5b12385253 pop_list <=> pop_list_node
These names seem like they should be swapped.
2023-02-05 19:47:32 -08:00
Simon Forman b70231bcff minor cleanup 2023-02-05 19:40:16 -08:00
Simon Forman 3a11fcb834 loop
But it's pretty inefficient, eh?
2023-02-05 18:43:05 -08:00
Simon Forman 26a733f720 first, rest 2023-02-05 17:40:26 -08:00
Simon Forman d3a9a6ff7f A README file. 2023-02-05 14:54:33 -08:00
Simon Forman ccbf8d2b4c minor cleanup 2023-02-05 13:53:53 -08:00
Simon Forman 8bda5d511a Auto-generate defintions from defs.txt
But it doesn't yet handle names with non-C-indentifier characters in
them.
2023-02-05 13:50:16 -08:00
Simon Forman 291b6caa75 Generate definitions.h; swons 2023-02-05 13:38:59 -08:00
Simon Forman 78b59dda35 Put defs into a generated file.
This is only part of the solution, we still need to update joy.h and
KEYWORDS.txt when defs.txt changes, and we need to handle names that
have non-C-identifier characters in them.

But it's a start...
2023-02-05 13:04:31 -08:00
Simon Forman 6eae43c27f push_quote_onto_expression
doesn't push an empty list, unlike push_quote() which does.
2023-02-05 11:58:44 -08:00
Simon Forman a9e4f93cdc concat 2023-02-05 11:00:22 -08:00
Simon Forman 6ee3226a88 swap 2023-02-05 10:27:17 -08:00
Simon Forman 514eaef70f forgot to save 2023-02-05 10:23:50 -08:00
Simon Forman bafb2a318b No clear def. 2023-02-05 10:05:20 -08:00
Simon Forman ac47f39ea3 Remove def of clear.
It's a neat example of a custom implementation being more efficient than
the Joy code.
2023-02-05 10:04:20 -08:00
Simon Forman 09e9e340a5 stack 2023-02-05 10:00:18 -08:00
Simon Forman 8f4c98a051 swaack 2023-02-05 09:54:52 -08:00
Simon Forman 9563f738bd pop 2023-02-05 09:50:41 -08:00
Simon Forman 3d0b5ba266 cons 2023-02-05 09:40:47 -08:00
Simon Forman fe4ce60541 dip 2023-02-05 08:49:05 -08:00
Simon Forman 4b3117e349 minor cleanup 2023-02-05 08:38:15 -08:00
Simon Forman f34b4547a5 dup 2023-02-05 08:37:13 -08:00
Simon Forman 4181daf40c minor cleanup 2023-02-05 08:12:32 -08:00
Simon Forman b1a06979c2 truthy 2023-02-04 23:45:13 -08:00
Simon Forman 7874496090 Definitions.
There are things to like about this implementation and things to
dislike.

Things to like:

- It works.
- The defs are baked into the wordlist.

Cons:

- The def bodies are built at start time by parsing strings.  it would
  be nice to somehow generate initializer literals if possible.  But
  would that mess up the garbage collector?
- It requires manual labor to update the defs when defs.txt changes.  It
  would be nice to have a solution that *make* can use.
2023-02-04 23:08:39 -08:00
Simon Forman 15482c1fdd A first attempt at definitions. 2023-02-04 22:58:38 -08:00
Simon Forman b70229d727 Almost truthy... 2023-02-04 22:58:16 -08:00
Simon Forman 6159165acd div and mod 2023-02-04 19:34:38 -08:00
Simon Forman 720f36a4c0 clear 2023-02-04 19:21:13 -08:00
Simon Forman c3e786aed9 branch combinator. 2023-02-04 19:19:48 -08:00
Simon Forman 21f99aac96 i combinator. 2023-02-04 19:05:26 -08:00
Simon Forman bd525cc7ac Depend on joy.h. 2023-02-04 18:59:59 -08:00
Simon Forman 62ed15d17a Minor cleanup, print_stack. 2023-02-04 18:51:58 -08:00
Simon Forman 8b4d265ed9 Minor cleanup. 2023-02-04 13:46:29 -08:00
Simon Forman b76213ff7e Expression is a list-of-lists now.
That way we don't have to concatinate quotes onto it all the time.
Instead we amortize in the next_term() function.
2023-02-04 13:38:28 -08:00
Simon Forman 45865acc2f Cmp, comes with GMP. 2023-02-04 12:47:45 -08:00
Simon Forman 42e7724e77 Boolean singleton values. 2023-02-04 11:27:03 -08:00
Simon Forman 81eebc5b9b Boolean singleton values. 2023-02-04 10:25:14 -08:00
Simon Forman 71c25e7bbd Node head is pointer now. 2023-02-04 08:12:30 -08:00
Simon Forman 2e4381b2c0 JoyListPtr too 2023-02-04 07:55:11 -08:00
Simon Forman 1eb8f1dde1 Use JoyListPtr. 2023-02-04 07:52:36 -08:00
Simon Forman 99fb04397f sub and mul through judicious (I hope) use of macros. 2023-02-03 19:38:18 -08:00
Simon Forman ecf79b9de0 pop_any(), pop_int(), and add 2023-02-03 15:46:52 -08:00
Simon Forman 3ae0e5b3a6 Interpret symbols.
C has function pointers, we can put them in the Gperf wordlist, this
makes the interpreter really simple.  No need for a dictionary (yet).

Implementing the basis functions will be a bit of a slog, and
I still have to implement definitions, but this is starting to shape up
nicely.
2023-02-03 11:48:32 -08:00
Simon Forman f2b2b92c2c Yet more minor cleanup. 2023-02-03 09:39:02 -08:00
Simon Forman 7df01dfe5e More minor cleanup. 2023-02-03 09:30:11 -08:00
Simon Forman 64eb28a648 Minor cleanup. 2023-02-03 09:27:30 -08:00
Simon Forman 8647f40895 newJoyList 2023-02-03 09:18:32 -08:00
Simon Forman fb40b11fb0 Can haz function pointers in my worldist. 2023-02-03 08:13:57 -08:00