Commit Graph

217 Commits

Author SHA1 Message Date
Simon Forman b9ae00cecb A few more functions.
reverse, shift, shunt, take, split_at
2019-08-09 07:26:37 -07:00
Simon Forman 712f0a0267 merge 2019-08-07 23:36:38 -07:00
Simon Forman 976b8302be grow/shrink as DCGs. 2019-08-07 23:28:28 -07:00
Simon Forman 4ea77cf1be Integer DCGs that work in both directions. 2019-08-07 11:40:49 -07:00
Simon Forman 0048ee212d loop combinator handles ambiguity.
remove some old notes.
2019-08-04 09:28:01 -07:00
Simon Forman a3f863ff18 Move is_numerical() to joy.gui.utils. 2019-08-03 19:02:24 -07:00
Simon Forman 177d6cd433 Experiment in formatting stacks for output.
Tracing, sort of...
2019-08-03 19:01:45 -07:00
Simon Forman 3b1a89d1c4 Minor refactor.
crbo/4 to to_fixed_point/3
2019-08-03 19:01:00 -07:00
Simon Forman cb0078f3bc Gnarly fun with metaprogramming. 2019-08-03 17:56:25 -07:00
Simon Forman 6a94c12b9b Get the path separator right on windows.
It used to use: C:\Users\sforman/.joypy

which worked, but ew.
2019-08-02 18:30:43 -07:00
Simon Forman 2ba9242b76 Comparisions are literals too.
Also a bunch of reformatting.

Maybe I can modify the term_expansion/2 to also write the literal/1 clauses for math and comps?
2019-07-22 10:25:34 -07:00
Simon Forman 97a99ac3c4 Bits of formatting. 2019-07-22 10:04:32 -07:00
Simon Forman df94c8feed Minor cleanup. 2019-07-21 18:48:11 -07:00
Simon Forman 66d8a3be47 Remove write_state/5. 2019-07-21 17:56:34 -07:00
Simon Forman 6818abb3ce Build a list of the moves taken. 2019-07-21 17:55:19 -07:00
Simon Forman 523cb3913b Refactor a bit. 2019-07-21 17:25:22 -07:00
Simon Forman c1442945a6 Assert definitions as they are read.
Instead of building a list then asserting them all after parsing.
2019-07-21 14:13:48 -07:00
Simon Forman 482ac3023e Messing with TLA+ in Prolog. 2019-07-21 11:50:27 -07:00
Simon Forman 32d5953f29 Implement map combinator. 2019-07-21 08:28:56 -07:00
Simon Forman 84a2de7790 Tiny edits. Almost nothing. 2019-07-21 07:32:20 -07:00
Simon Forman 1b5d1c0b82 Remove cuts from branch combinator. 2019-07-20 19:34:56 -07:00
Simon Forman 206f49598e Add mod, gcd, and hypot; term_expansion for math ops. 2019-07-20 19:26:11 -07:00
Simon Forman ae769d2341 Fold try_both_branches/4 into branch combo. 2019-07-20 17:36:58 -07:00
Simon Forman 230288c02c Replace ? with plain ol' def/2.
As much fun as it was using ? as an operator, now that all the defs live in a text file you don't see it in the Prolog code anymore.

This way I get to use sweet sweet ASCII (except for the ? symbol in the copyright notice.)
2019-07-20 17:32:03 -07:00
Simon Forman 7354911d05 WTF error handler.
Made it check that the unknown term really isn't a literal, definition, function, or combinator.
2019-07-20 17:19:35 -07:00
Simon Forman 2a66e7fb47 If I comment out the WTF handler...
...then the branch combinator works as intended.  (Although the constraint-based stuff was also cool, it would have captured information from the comparison.)


?- joy(`[32 >] [++] [--] ifte`, Si, So).
Si = [_6598|_6600],
So = [_6598+1|_6600] ;
Si = [_6598|_6600],
So = [_6598-1|_6600] ;
false.

?- sjc(hmm, `[32 >] [++] [--] ifte`).
func(hmm, [A|B], [A+1|B]).
true ;
func(hmm, [A|B], [A-1|B]).
true ;
false.
2019-07-20 16:57:19 -07:00
Simon Forman 714bf2cab6 Try to handle expressions in branch combinator.
If the expression isn't 'true' or 'false' atoms then we assume it's a comparison expression and try to check its truth value.

If this fails then it will try both branches, to allow for e.g. compilation.  THis almost works, but there's a choice point or something that gets hit before it tries the false path,

?- joy(` [32 >] [++] [--] ifte`, Si, So).
Si = [_2076|_2078],
So = [_2076+1|_2078] ;
wtf? +
Si = [_2076|_2078],
So = [[+], 1, _2076|_2078] ;
Si = [_2076|_2078],
So = [_2076-1|_2078] ;
wtf? -
Si = [_2076|_2078],
So = [[-], 1, _2076|_2078] ;
wtf? branch
Si = [_2076|_2078],
So = [[branch], [++], [--], _2076>32, _2076|_2078] ;
wtf? swap
Si = [_2076|_2078],
So = [[swap, branch], [--], [++], _2076>32, _2076|_2078] ;
wtf? first
Si = [_2076|_2078],
So = [[first, [++], [--], swap, branch], [_2076>32|_2078], _2076|_2078]


etc...
2019-07-20 16:45:28 -07:00
Simon Forman c676dce2f9 Handle exceptions in comparison ops.
You can't compare logic vars, so just bunt.
2019-07-20 16:38:48 -07:00
Simon Forman 47ae7b2328 More readable genrec.
Explicit quoting is slightly more overhead but worth it I think to show what's going on more clearly.
2019-07-16 09:53:48 -07:00
Simon Forman efeaa7b8e1 A little helper function to see compiled expressions.
Example from ordered binary tree notebook:

    ?- sjc(tree_add_Ee, `pop swap rolldown rrest ccons`).
    func(tree_add_Ee, [_, [_, _|C], A, B|D], [[A, B|C]|D]).
    true .
2019-07-16 09:46:55 -07:00
Simon Forman 6d92b8801f Clear out CLP(FD) functions.
I like them but then you are constrained (pun intended) to only using integers.  I'll probably bring them back at some point, either as an alternate implementation or their own commands.
2019-07-16 08:59:24 -07:00
Simon Forman 731b49973c Opps! Here's the implementation of bool. 2019-07-16 08:42:45 -07:00
Simon Forman c4c6ece6d2 Add bool function to mimic Python semantics. 2019-07-16 08:41:28 -07:00
Simon Forman 06b81914eb Change comparison ops to not use CLP(FD). 2019-07-15 23:02:08 -07:00
Simon Forman 84584a949c Implement genrec combinator. 2019-07-15 20:55:41 -07:00
Simon Forman 2baf3b89ce Minor cleanup of defs. 2019-07-15 20:55:11 -07:00
Simon Forman 9ebc64541a Move all definitions to defs.txt. 2019-07-15 16:11:49 -07:00
Simon Forman ee395e91f1 Retract previous definitions before asserting new ones. 2019-07-15 16:01:59 -07:00
Simon Forman 4fefc04da3 Load definitions from a file.
This paves the way to regularize the defs between Python and Prolog (and and future other) implementations.
2019-07-15 15:53:07 -07:00
Simon Forman 0359cd64c7 Very minor docs change. 2019-07-15 15:50:22 -07:00
Simon Forman 087c141c72 Parse joy definitions from text.
This way a definitions file can be shared between Python Joy and Prolog Joy.
2019-07-15 12:53:48 -07:00
Simon Forman 166355dccf New combinator infrst == infra first
Three uses means it's time for a refactor.
2019-07-15 12:28:01 -07:00
Simon Forman 4ea1a5527e nullary combinator as definition.
That eliminates all the recursive calls to thun/3 (outside of thun itself, which is tail recursive.)  That means that this Joy interpreter is now fully CPS.

All state is contained in the stack and expression, nothing is hidden in the Prolog "call stack".
2019-07-15 11:20:13 -07:00
Simon Forman d3313ce4a7 Infra as definition. 2019-07-14 23:02:10 -07:00
Simon Forman 9f1e75313b Reimplement app1 and app2 as definitions.
This eliminates three recursive calls to thun/3.
2019-07-14 22:48:18 -07:00
Simon Forman f227cf0a57 Got enough definitions, sort them. 2019-07-14 21:58:20 -07:00
Simon Forman a90568e208 Switch to symbolic math (from CLP(FD).)
A wee bit of error reporting of unknown terms.

New functions: pm plus-or-minus and neg negate; new combinator dupdip.
2019-07-14 21:14:50 -07:00
Simon Forman e0d8910242 Docs on Start Up Sequence 2019-05-07 23:23:53 -07:00
Simon Forman 21b69ea260 Stop hg ignoring the build dir.
I want to include the HTML output of sphinx so you can view it without having to install sphinx.
2019-05-07 17:45:39 -07:00
Simon Forman 4f5caf4ab3 More docs... 2019-05-07 13:49:27 -07:00