Commit Graph

1057 Commits

Author SHA1 Message Date
sforman e9f971460f Type alias JList 2023-07-29 08:49:31 -07:00
sforman 9917a2cfba 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.
2023-07-29 07:51:31 -07:00
sforman b6b3acf350 Binary Math Ops 2023-07-29 07:32:56 -07:00
sforman dc065d1943 I don't think andThen helps here? 2023-07-29 07:19:08 -07:00
sforman 48f6e78196 I can add integers! 2023-07-29 06:54:15 -07:00
sforman 5315edbe83 Parsing working.
Modeled on the OCaml code.
2023-07-28 21:51:34 -07:00
sforman 9d57545533 A start on Joy types. 2023-07-28 15:04:35 -07:00
sforman 590a5b207c In Elm. 2023-07-28 14:18:12 -07:00
sforman 23504f6ede 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.)
2023-07-27 10:32:45 -07:00
sforman f60c138a2c minor cleanup 2023-07-27 09:55:26 -07:00
sforman 08262ac861 minor cleanup 2023-07-27 09:55:02 -07:00
sforman ef504aa1c4 Rename joy_to_ast to parser. 2023-07-27 09:19:12 -07:00
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