Still converting syntax highlighter spec.
This commit is contained in:
File diff suppressed because it is too large
Load Diff
+28
-28
@@ -76,7 +76,7 @@ E.g.:
|
||||
Implementation
|
||||
--------------
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
from functools import partial as curry
|
||||
from itertools import product
|
||||
@@ -86,7 +86,7 @@ Implementation
|
||||
|
||||
The empty set and the set of just the empty string.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
phi = frozenset() # ϕ
|
||||
y = frozenset({''}) # λ
|
||||
@@ -101,7 +101,7 @@ alphabet with two symbols (if you had to.)
|
||||
I chose the names ``O`` and ``l`` (uppercase “o” and lowercase “L”) to
|
||||
look like ``0`` and ``1`` (zero and one) respectively.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
syms = O, l = frozenset({'0'}), frozenset({'1'})
|
||||
|
||||
@@ -123,7 +123,7 @@ expression* is one of:
|
||||
|
||||
Where ``R`` and ``S`` stand for *regular expressions*.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
AND, CONS, KSTAR, NOT, OR = 'and cons * not or'.split() # Tags are just strings.
|
||||
|
||||
@@ -133,7 +133,7 @@ only, these datastructures are immutable.
|
||||
String Representation of RE Datastructures
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def stringy(re):
|
||||
'''
|
||||
@@ -175,11 +175,11 @@ Match anything. Often spelled “.”
|
||||
|
||||
I = (0|1)*
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
I = (KSTAR, (OR, O, l))
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
print stringy(I)
|
||||
|
||||
@@ -201,14 +201,14 @@ The example expression from Brzozowski:
|
||||
|
||||
Note that it contains one of everything.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
a = (CONS, I, (CONS, l, (CONS, l, (CONS, l, I))))
|
||||
b = (CONS, I, (CONS, O, l))
|
||||
c = (CONS, l, (KSTAR, l))
|
||||
it = (AND, a, (NOT, (OR, b, c)))
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
print stringy(it)
|
||||
|
||||
@@ -223,7 +223,7 @@ Note that it contains one of everything.
|
||||
|
||||
Let’s get that auxiliary predicate function ``δ`` out of the way.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def nully(R):
|
||||
'''
|
||||
@@ -263,7 +263,7 @@ This is the straightforward version with no “compaction”. It works fine,
|
||||
but does waaaay too much work because the expressions grow each
|
||||
derivation.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def D(symbol):
|
||||
|
||||
@@ -308,7 +308,7 @@ derivation.
|
||||
Compaction Rules
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def _compaction_rule(relation, one, zero, a, b):
|
||||
return (
|
||||
@@ -320,7 +320,7 @@ Compaction Rules
|
||||
|
||||
An elegant symmetry.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
# R ∧ I = I ∧ R = R
|
||||
# R ∧ ϕ = ϕ ∧ R = ϕ
|
||||
@@ -341,7 +341,7 @@ We can save re-processing by remembering results we have already
|
||||
computed. RE datastructures are immutable and the ``derv()`` functions
|
||||
are *pure* so this is fine.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
class Memo(object):
|
||||
|
||||
@@ -365,7 +365,7 @@ With “Compaction”
|
||||
This version uses the rules above to perform compaction. It keeps the
|
||||
expressions from growing too large.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def D_compaction(symbol):
|
||||
|
||||
@@ -414,7 +414,7 @@ Let’s try it out…
|
||||
|
||||
(FIXME: redo.)
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
o, z = D_compaction('0'), D_compaction('1')
|
||||
REs = set()
|
||||
@@ -605,20 +605,20 @@ You can see the one-way nature of the ``g`` state and the ``hij`` “trap”
|
||||
in the way that the ``.111.`` on the left-hand side of the ``&``
|
||||
disappears once it has been matched.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
from collections import defaultdict
|
||||
from pprint import pprint
|
||||
from string import ascii_lowercase
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
d0, d1 = D_compaction('0'), D_compaction('1')
|
||||
|
||||
``explore()``
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def explore(re):
|
||||
|
||||
@@ -645,7 +645,7 @@ disappears once it has been matched.
|
||||
|
||||
return table, accepting
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
table, accepting = explore(it)
|
||||
table
|
||||
@@ -678,7 +678,7 @@ disappears once it has been matched.
|
||||
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
accepting
|
||||
|
||||
@@ -697,7 +697,7 @@ Generate Diagram
|
||||
Once we have the FSM table and the set of accepting states we can
|
||||
generate the diagram above.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
_template = '''\
|
||||
digraph finite_state_machine {
|
||||
@@ -722,7 +722,7 @@ generate the diagram above.
|
||||
)
|
||||
)
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
print make_graph(table, accepting)
|
||||
|
||||
@@ -776,7 +776,7 @@ Trampoline Function
|
||||
Python has no GOTO statement but we can fake it with a “trampoline”
|
||||
function.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def trampoline(input_, jump_from, accepting):
|
||||
I = iter(input_)
|
||||
@@ -793,7 +793,7 @@ Stream Functions
|
||||
Little helpers to process the iterator of our data (a “stream” of “1”
|
||||
and “0” characters, not bits.)
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
getch = lambda I: int(next(I))
|
||||
|
||||
@@ -816,7 +816,7 @@ code. (You have to imagine that these are GOTO statements in C or
|
||||
branches in assembly and that the state names are branch destination
|
||||
labels.)
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
a = lambda I: c if getch(I) else b
|
||||
b = lambda I: _0(I) or d
|
||||
@@ -833,12 +833,12 @@ Note that the implementations of ``h`` and ``g`` are identical ergo
|
||||
``h = g`` and we could eliminate one in the code but ``h`` is an
|
||||
accepting state and ``g`` isn’t.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def acceptable(input_):
|
||||
return trampoline(input_, a, {h, i})
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
for n in range(2**5):
|
||||
s = bin(n)[2:]
|
||||
|
||||
@@ -12,7 +12,7 @@ As an example of developing a program in Joy let's take the first problem from t
|
||||
|
||||
Find the sum of all the multiples of 3 or 5 below 1000.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
from notebook_preamble import J, V, define
|
||||
|
||||
@@ -22,11 +22,11 @@ Sum a range filtered by a predicate
|
||||
Let's create a predicate that returns ``True`` if a number is a multiple
|
||||
of 3 or 5 and ``False`` otherwise.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('P == [3 % not] dupdip 5 % not or')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
V('80 P')
|
||||
|
||||
@@ -108,11 +108,11 @@ the counter to the running sum. This function will do that:
|
||||
|
||||
PE1.1 == + [+] dupdip
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('PE1.1 == + [+] dupdip')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
V('0 0 3 PE1.1')
|
||||
|
||||
@@ -131,7 +131,7 @@ the counter to the running sum. This function will do that:
|
||||
3 3 .
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
V('0 0 [3 2 1 3 1 2 3] [PE1.1] step')
|
||||
|
||||
@@ -219,7 +219,7 @@ total to 60.
|
||||
How many multiples to sum?
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
1000 / 15
|
||||
|
||||
@@ -232,7 +232,7 @@ How many multiples to sum?
|
||||
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
66 * 15
|
||||
|
||||
@@ -245,7 +245,7 @@ How many multiples to sum?
|
||||
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
1000 - 990
|
||||
|
||||
@@ -260,7 +260,7 @@ How many multiples to sum?
|
||||
|
||||
We only want the terms *less than* 1000.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
999 - 990
|
||||
|
||||
@@ -276,11 +276,11 @@ We only want the terms *less than* 1000.
|
||||
That means we want to run the full list of numbers sixty-six times to
|
||||
get to 990 and then the first four numbers 3 2 1 3 to get to 999.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('PE1 == 0 0 66 [[3 2 1 3 1 2 3] [PE1.1] step] times [3 2 1 3] [PE1.1] step pop')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('PE1')
|
||||
|
||||
@@ -305,7 +305,7 @@ integer terms from the list.
|
||||
3 2 1 3 1 2 3
|
||||
0b 11 10 01 11 01 10 11 == 14811
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
0b11100111011011
|
||||
|
||||
@@ -318,11 +318,11 @@ integer terms from the list.
|
||||
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('PE1.2 == [3 & PE1.1] dupdip 2 >>')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
V('0 0 14811 PE1.2')
|
||||
|
||||
@@ -349,7 +349,7 @@ integer terms from the list.
|
||||
3 3 3702 .
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
V('3 3 3702 PE1.2')
|
||||
|
||||
@@ -376,7 +376,7 @@ integer terms from the list.
|
||||
8 5 925 .
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
V('0 0 14811 7 [PE1.2] times pop')
|
||||
|
||||
@@ -518,11 +518,11 @@ integer terms from the list.
|
||||
|
||||
And so we have at last:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('PE1 == 0 0 66 [14811 7 [PE1.2] times pop] times 14811 4 [PE1.2] times popop')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('PE1')
|
||||
|
||||
@@ -542,17 +542,17 @@ Let's refactor
|
||||
14811 n [PE1.2] times pop
|
||||
n 14811 swap [PE1.2] times pop
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('PE1.3 == 14811 swap [PE1.2] times pop')
|
||||
|
||||
Now we can simplify the definition above:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('PE1 == 0 0 66 [7 PE1.3] times 4 PE1.3 pop')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('PE1')
|
||||
|
||||
@@ -581,11 +581,11 @@ then four more. In the *Generator Programs* notebook we derive a
|
||||
generator that can be repeatedly driven by the ``x`` combinator to
|
||||
produce a stream of the seven numbers repeating over and over again.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('PE1.terms == [0 swap [dup [pop 14811] [] branch [3 &] dupdip 2 >>] dip rest cons]')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('PE1.terms 21 [x] times')
|
||||
|
||||
@@ -598,7 +598,7 @@ produce a stream of the seven numbers repeating over and over again.
|
||||
We know from above that we need sixty-six times seven then four more
|
||||
terms to reach up to but not over one thousand.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('7 66 * 4 +')
|
||||
|
||||
@@ -611,7 +611,7 @@ terms to reach up to but not over one thousand.
|
||||
Here they are...
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('PE1.terms 466 [x] times pop')
|
||||
|
||||
@@ -624,7 +624,7 @@ Here they are...
|
||||
...and they do sum to 999.
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[PE1.terms 466 [x] times pop] run sum')
|
||||
|
||||
@@ -638,7 +638,7 @@ Now we can use ``PE1.1`` to accumulate the terms as we go, and then
|
||||
``pop`` the generator and the counter from the stack when we're done,
|
||||
leaving just the sum.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('0 0 PE1.terms 466 [x [PE1.1] dip] times popop')
|
||||
|
||||
@@ -654,7 +654,7 @@ A little further analysis renders iteration unnecessary.
|
||||
Consider finding the sum of the positive integers less than or equal to
|
||||
ten.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[10 9 8 7 6 5 4 3 2 1] sum')
|
||||
|
||||
@@ -686,11 +686,11 @@ positive integers is:
|
||||
(The formula also works for odd values of N, I'll leave that to you if
|
||||
you want to work it out or you can take my word for it.)
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('F == dup ++ * 2 floordiv')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
V('10 F')
|
||||
|
||||
@@ -727,7 +727,7 @@ And ending with:
|
||||
|
||||
If we reverse one of these two blocks and sum pairs...
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[3 5 6 9 10 12 15] reverse [978 980 981 984 985 987 990] zip')
|
||||
|
||||
@@ -737,7 +737,7 @@ If we reverse one of these two blocks and sum pairs...
|
||||
[[978 15] [980 12] [981 10] [984 9] [985 6] [987 5] [990 3]]
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[3 5 6 9 10 12 15] reverse [978 980 981 984 985 987 990] zip [sum] map')
|
||||
|
||||
@@ -750,7 +750,7 @@ If we reverse one of these two blocks and sum pairs...
|
||||
(Interesting that the sequence of seven numbers appears again in the
|
||||
rightmost digit of each term.)
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[ 3 5 6 9 10 12 15] reverse [978 980 981 984 985 987 990] zip [sum] map sum')
|
||||
|
||||
@@ -771,7 +771,7 @@ additional unpaired terms between 990 and 1000:
|
||||
So we can give the "sum of all the multiples of 3 or 5 below 1000" like
|
||||
so:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('6945 33 * [993 995 996 999] cons sum')
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ Using ``x`` to Generate Values
|
||||
|
||||
Cf. jp-reprod.html
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
from notebook_preamble import J, V, define
|
||||
|
||||
@@ -57,7 +57,7 @@ We can make a generator for the Natural numbers (0, 1, 2, …) by using
|
||||
|
||||
Let’s try it:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
V('[0 swap [dup ++] dip rest cons] x')
|
||||
|
||||
@@ -81,7 +81,7 @@ Let’s try it:
|
||||
After one application of ``x`` the quoted program contains ``1`` and
|
||||
``0`` is below it on the stack.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[0 swap [dup ++] dip rest cons] x x x x x pop')
|
||||
|
||||
@@ -94,11 +94,11 @@ After one application of ``x`` the quoted program contains ``1`` and
|
||||
``direco``
|
||||
----------
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('direco == dip rest cons')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
V('[0 swap [dup ++] direco] x')
|
||||
|
||||
@@ -149,13 +149,13 @@ Reading from the bottom up:
|
||||
G == [direco] cons [swap] swap concat cons
|
||||
G == [direco] cons [swap] swoncat cons
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('G == [direco] cons [swap] swoncat cons')
|
||||
|
||||
Let’s try it out:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('0 [dup ++] G')
|
||||
|
||||
@@ -165,7 +165,7 @@ Let’s try it out:
|
||||
[0 swap [dup ++] direco]
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('0 [dup ++] G x x x pop')
|
||||
|
||||
@@ -178,7 +178,7 @@ Let’s try it out:
|
||||
Powers of 2
|
||||
~~~~~~~~~~~
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('1 [dup 1 <<] G x x x x x x x x x pop')
|
||||
|
||||
@@ -194,7 +194,7 @@ Powers of 2
|
||||
If we have one of these quoted programs we can drive it using ``times``
|
||||
with the ``x`` combinator.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('23 [dup ++] G 5 [x] times')
|
||||
|
||||
@@ -226,11 +226,11 @@ int:
|
||||
And pick them off by masking with 3 (binary 11) and then shifting the
|
||||
int right two bits.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('PE1.1 == dup [3 &] dip 2 >>')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
V('14811 PE1.1')
|
||||
|
||||
@@ -252,7 +252,7 @@ int right two bits.
|
||||
|
||||
If we plug ``14811`` and ``[PE1.1]`` into our generator form…
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('14811 [PE1.1] G')
|
||||
|
||||
@@ -264,7 +264,7 @@ If we plug ``14811`` and ``[PE1.1]`` into our generator form…
|
||||
|
||||
…we get a generator that works for seven cycles before it reaches zero:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[14811 swap [PE1.1] direco] 7 [x] times')
|
||||
|
||||
@@ -280,11 +280,11 @@ Reset at Zero
|
||||
We need a function that checks if the int has reached zero and resets it
|
||||
if so.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('PE1.1.check == dup [pop 14811] [] branch')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('14811 [PE1.1.check PE1.1] G')
|
||||
|
||||
@@ -294,7 +294,7 @@ if so.
|
||||
[14811 swap [PE1.1.check PE1.1] direco]
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[14811 swap [PE1.1.check PE1.1] direco] 21 [x] times')
|
||||
|
||||
@@ -316,7 +316,7 @@ In the PE1 problem we are asked to sum all the multiples of three and
|
||||
five less than 1000. It’s worked out that we need to use all seven
|
||||
numbers sixty-six times and then four more.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('7 66 * 4 +')
|
||||
|
||||
@@ -328,7 +328,7 @@ numbers sixty-six times and then four more.
|
||||
|
||||
If we drive our generator 466 times and sum the stack we get 999.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[14811 swap [PE1.1.check PE1.1] direco] 466 [x] times')
|
||||
|
||||
@@ -338,7 +338,7 @@ If we drive our generator 466 times and sum the stack we get 999.
|
||||
3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 [57 swap [PE1.1.check PE1.1] direco]
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[14811 swap [PE1.1.check PE1.1] direco] 466 [x] times pop enstacken sum')
|
||||
|
||||
@@ -351,13 +351,13 @@ If we drive our generator 466 times and sum the stack we get 999.
|
||||
Project Euler Problem One
|
||||
-------------------------
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('PE1.2 == + dup [+] dip')
|
||||
|
||||
Now we can add ``PE1.2`` to the quoted program given to ``G``.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('0 0 0 [PE1.1.check PE1.1] G 466 [x [PE1.2] dip] times popop')
|
||||
|
||||
@@ -445,15 +445,15 @@ Putting it all together:
|
||||
F == + [popdd over] cons infra uncons
|
||||
fib_gen == [1 1 F]
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('fib == + [popdd over] cons infra uncons')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('fib_gen == [1 1 fib]')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('fib_gen 10 [x] times')
|
||||
|
||||
@@ -473,14 +473,14 @@ Now that we have a generator for the Fibonacci sequence, we need a
|
||||
function that adds a term in the sequence to a sum if it is even, and
|
||||
``pop``\ s it otherwise.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('PE2.1 == dup 2 % [+] [pop] branch')
|
||||
|
||||
And a predicate function that detects when the terms in the series
|
||||
“exceed four million”.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('>4M == 4000000 >')
|
||||
|
||||
@@ -488,11 +488,11 @@ Now it’s straightforward to define ``PE2`` as a recursive function that
|
||||
generates terms in the Fibonacci sequence until they exceed four million
|
||||
and sums the even ones.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('PE2 == 0 fib_gen x [pop >4M] [popop] [[PE2.1] dip x] primrec')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('PE2')
|
||||
|
||||
@@ -535,7 +535,7 @@ So the Fibonacci sequence considered in terms of just parity would be:
|
||||
|
||||
Every third term is even.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[1 0 fib] x x x') # To start the sequence with 1 1 2 3 instead of 1 2 3.
|
||||
|
||||
@@ -547,7 +547,7 @@ Every third term is even.
|
||||
|
||||
Drive the generator three times and ``popop`` the two odd terms.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[1 0 fib] x x x [popop] dipd')
|
||||
|
||||
@@ -557,11 +557,11 @@ Drive the generator three times and ``popop`` the two odd terms.
|
||||
2 [3 2 fib]
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('PE2.2 == x x x [popop] dipd')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[1 0 fib] 10 [PE2.2] times')
|
||||
|
||||
@@ -574,7 +574,7 @@ Drive the generator three times and ``popop`` the two odd terms.
|
||||
Replace ``x`` with our new driver function ``PE2.2`` and start our
|
||||
``fib`` generator at ``1 0``.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('0 [1 0 fib] PE2.2 [pop >4M] [popop] [[PE2.1] dip PE2.2] primrec')
|
||||
|
||||
@@ -593,11 +593,11 @@ modifications to the default ``x``?
|
||||
An Interesting Variation
|
||||
------------------------
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('codireco == cons dip rest cons')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
V('[0 [dup ++] codireco] x')
|
||||
|
||||
@@ -620,11 +620,11 @@ An Interesting Variation
|
||||
0 [1 [dup ++] codireco] .
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('G == [codireco] cons cons')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('230 [dup ++] G 5 [x] times pop')
|
||||
|
||||
|
||||
@@ -150,7 +150,7 @@ TBD (look in the :module: joy.parser module.)
|
||||
Examples
|
||||
~~~~~~~~~~~
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
joy.parser.text_to_expression('1 2 3 4 5') # A simple sequence.
|
||||
|
||||
@@ -160,7 +160,7 @@ Examples
|
||||
(1, (2, (3, (4, (5, ())))))
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
joy.parser.text_to_expression('[1 2 3] 4 5') # Three items, the first is a list with three items
|
||||
|
||||
@@ -170,7 +170,7 @@ Examples
|
||||
((1, (2, (3, ()))), (4, (5, ())))
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
joy.parser.text_to_expression('1 23 ["four" [-5.0] cons] 8888') # A mixed bag. cons is
|
||||
# a Symbol, no lookup at
|
||||
@@ -184,7 +184,7 @@ Examples
|
||||
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
joy.parser.text_to_expression('[][][][][]') # Five empty lists.
|
||||
|
||||
@@ -197,7 +197,7 @@ Examples
|
||||
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
joy.parser.text_to_expression('[[[[[]]]]]') # Five nested lists.
|
||||
|
||||
@@ -221,7 +221,7 @@ provide control-flow and higher-order operations.
|
||||
|
||||
Many of the functions are defined in Python, like ``dip``:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
print inspect.getsource(joy.library.dip)
|
||||
|
||||
@@ -239,7 +239,7 @@ When the interpreter executes a definition function that function just
|
||||
pushes its body expression onto the pending expression (the
|
||||
continuation) and returns control to the interpreter.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
print joy.library.definitions
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ implementation under the hood. (Where does the “type” come from? It has
|
||||
a contingent existence predicated on the disciplined use of these
|
||||
functions on otherwise undistinguished Joy datastructures.)
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
from notebook_preamble import D, J, V, define, DefinitionWrapper
|
||||
|
||||
@@ -87,11 +87,11 @@ Definition:
|
||||
|
||||
Tree-new == swap [[] []] cons cons
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('Tree-new == swap [[] []] cons cons')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('"v" "k" Tree-new')
|
||||
|
||||
@@ -163,11 +163,11 @@ comparison operator:
|
||||
P < == pop roll> pop first <
|
||||
P == pop roll> pop first
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('P == pop roll> pop first')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('["old_key" 23 [] []] 17 "new_key" ["..."] P')
|
||||
|
||||
@@ -242,11 +242,11 @@ And so ``T`` is just:
|
||||
|
||||
T == cons cons [dipdd] cons infra
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('T == cons cons [dipdd] cons infra')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('["old_k" "old_value" "left" "right"] "new_value" "new_key" ["Tree-add"] T')
|
||||
|
||||
@@ -266,7 +266,7 @@ This is very very similar to the above:
|
||||
[key_n value_n left right] value key [Tree-add] E
|
||||
[key_n value_n left right] value key [Tree-add] [P <] [Te] [Ee] ifte
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('E == [P <] [Te] [Ee] ifte')
|
||||
|
||||
@@ -278,11 +278,11 @@ instead of the right, so the only difference is that it must use
|
||||
|
||||
Te == cons cons [dipd] cons infra
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('Te == cons cons [dipd] cons infra')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('["old_k" "old_value" "left" "right"] "new_value" "new_key" ["Tree-add"] Te')
|
||||
|
||||
@@ -320,11 +320,11 @@ Example:
|
||||
key new_value [ left right] cons cons
|
||||
[key new_value left right]
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('Ee == pop swap roll< rest rest cons cons')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('["k" "old_value" "left" "right"] "new_value" "k" ["Tree-add"] Ee')
|
||||
|
||||
@@ -355,14 +355,14 @@ Putting it all together:
|
||||
|
||||
Tree-add == [popop not] [[pop] dipd Tree-new] [] [R] genrec
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('Tree-add == [popop not] [[pop] dipd Tree-new] [] [[P >] [T] [E] ifte] genrec')
|
||||
|
||||
Examples
|
||||
~~~~~~~~
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[] 23 "b" Tree-add') # Initial
|
||||
|
||||
@@ -372,7 +372,7 @@ Examples
|
||||
['b' 23 [] []]
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('["b" 23 [] []] 88 "c" Tree-add') # Greater than
|
||||
|
||||
@@ -382,7 +382,7 @@ Examples
|
||||
['b' 23 [] ['c' 88 [] []]]
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('["b" 23 [] []] 88 "a" Tree-add') # Less than
|
||||
|
||||
@@ -392,7 +392,7 @@ Examples
|
||||
['b' 23 ['a' 88 [] []] []]
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('["b" 23 [] []] 88 "b" Tree-add') # Equal to
|
||||
|
||||
@@ -402,7 +402,7 @@ Examples
|
||||
['b' 88 [] []]
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[] 23 "b" Tree-add 88 "a" Tree-add 44 "c" Tree-add') # Series.
|
||||
|
||||
@@ -412,7 +412,7 @@ Examples
|
||||
['b' 23 ['a' 88 [] []] ['c' 44 [] []]]
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[] [[23 "b"] [88 "a"] [44 "c"]] [i Tree-add] step')
|
||||
|
||||
@@ -444,7 +444,7 @@ values:
|
||||
------------------------- a < b
|
||||
L
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J("1 0 ['G'] ['E'] ['L'] cmp")
|
||||
|
||||
@@ -454,7 +454,7 @@ values:
|
||||
'G'
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J("1 1 ['G'] ['E'] ['L'] cmp")
|
||||
|
||||
@@ -464,7 +464,7 @@ values:
|
||||
'E'
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J("0 1 ['G'] ['E'] ['L'] cmp")
|
||||
|
||||
@@ -514,7 +514,7 @@ Or just:
|
||||
|
||||
P == over [popop popop first] nullary
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('P == over [popop popop first] nullary')
|
||||
|
||||
@@ -541,11 +541,11 @@ to understand:
|
||||
|
||||
Tree-add == [popop not] [[pop] dipd Tree-new] [] [P [T] [Ee] [Te] cmp] genrec
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('Tree-add == [popop not] [[pop] dipd Tree-new] [] [P [T] [Ee] [Te] cmp] genrec')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[] 23 "b" Tree-add 88 "a" Tree-add 44 "c" Tree-add') # Still works.
|
||||
|
||||
@@ -685,14 +685,14 @@ Working backward:
|
||||
|
||||
Tree-iter == [not] [pop] roll< [dupdip rest rest] cons [step] genrec
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('Tree-iter == [not] [pop] roll< [dupdip rest rest] cons [step] genrec')
|
||||
|
||||
Examples
|
||||
~~~~~~~~
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[] [foo] Tree-iter') # It doesn't matter what F is as it won't be used.
|
||||
|
||||
@@ -702,7 +702,7 @@ Examples
|
||||
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J("['b' 23 ['a' 88 [] []] ['c' 44 [] []]] [first] Tree-iter")
|
||||
|
||||
@@ -712,7 +712,7 @@ Examples
|
||||
'b' 'a' 'c'
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J("['b' 23 ['a' 88 [] []] ['c' 44 [] []]] [second] Tree-iter")
|
||||
|
||||
@@ -731,7 +731,7 @@ to it will only occur once within it, and we can query it in
|
||||
`:math:`O(\log_2 N)` <https://en.wikipedia.org/wiki/Binary_search_tree#cite_note-2>`__
|
||||
time.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[] [3 9 5 2 8 6 7 8 4] [0 swap Tree-add] step')
|
||||
|
||||
@@ -741,11 +741,11 @@ time.
|
||||
[3 0 [2 0 [] []] [9 0 [5 0 [4 0 [] []] [8 0 [6 0 [] [7 0 [] []]] []]] []]]
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('to_set == [] swap [0 swap Tree-add] step')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[3 9 5 2 8 6 7 8 4] to_set')
|
||||
|
||||
@@ -758,11 +758,11 @@ time.
|
||||
And with that we can write a little program ``unique`` to remove
|
||||
duplicate items from a list.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('unique == [to_set [first] Tree-iter] cons run')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[3 9 3 5 2 9 8 8 8 6 2 7 8 4 3] unique') # Filter duplicate items.
|
||||
|
||||
@@ -872,7 +872,7 @@ Let’s do a little semantic factoring:
|
||||
|
||||
Now we can sort sequences.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
#define('Tree-iter-order == [not] [pop] [dup third] [[cons dip] dupdip [[first] dupdip] dip [rest rest rest first] dip i] genrec')
|
||||
|
||||
@@ -892,7 +892,7 @@ Now we can sort sequences.
|
||||
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[3 9 5 2 8 6 7 8 4] to_set Tree-iter-order')
|
||||
|
||||
@@ -1070,7 +1070,7 @@ So:
|
||||
|
||||
Tree-get == [pop not] swap [] [P [T>] [E] [T<] cmp] genrec
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
# I don't want to deal with name conflicts with the above so I'm inlining everything here.
|
||||
# The original Joy system has "hide" which is a meta-command which allows you to use named
|
||||
@@ -1088,7 +1088,7 @@ So:
|
||||
] genrec
|
||||
''')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('["gary" 23 [] []] "mike" [popd " not in tree" +] Tree-get')
|
||||
|
||||
@@ -1098,7 +1098,7 @@ So:
|
||||
'mike not in tree'
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('["gary" 23 [] []] "gary" [popop "err"] Tree-get')
|
||||
|
||||
@@ -1108,7 +1108,7 @@ So:
|
||||
23
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('''
|
||||
|
||||
@@ -1124,7 +1124,7 @@ So:
|
||||
2
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('''
|
||||
|
||||
@@ -1500,7 +1500,7 @@ Refactoring
|
||||
By the standards of the code I’ve written so far, this is a *huge* Joy
|
||||
program.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
DefinitionWrapper.add_definitions('''
|
||||
first_two == uncons uncons pop
|
||||
@@ -1519,7 +1519,7 @@ program.
|
||||
Tree-Delete == [pop not] [pop] [R0] [R1] genrec
|
||||
''', D)
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'c' Tree-Delete ")
|
||||
|
||||
@@ -1529,7 +1529,7 @@ program.
|
||||
['a' 23 [] ['b' 88 [] []]]
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'b' Tree-Delete ")
|
||||
|
||||
@@ -1539,7 +1539,7 @@ program.
|
||||
['a' 23 [] ['c' 44 [] []]]
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'a' Tree-Delete ")
|
||||
|
||||
@@ -1549,7 +1549,7 @@ program.
|
||||
['b' 88 [] ['c' 44 [] []]]
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'der' Tree-Delete ")
|
||||
|
||||
@@ -1559,7 +1559,7 @@ program.
|
||||
['a' 23 [] ['b' 88 [] ['c' 44 [] []]]]
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[] [4 2 3 1 6 7 5 ] [0 swap Tree-add] step')
|
||||
|
||||
@@ -1569,7 +1569,7 @@ program.
|
||||
[4 0 [2 0 [1 0 [] []] [3 0 [] []]] [6 0 [5 0 [] []] [7 0 [] []]]]
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J("[4 0 [2 0 [1 0 [] []] [3 0 [] []]] [6 0 [5 0 [] []] [7 0 [] []]]] 3 Tree-Delete ")
|
||||
|
||||
@@ -1579,7 +1579,7 @@ program.
|
||||
[4 0 [2 0 [1 0 [] []] []] [6 0 [5 0 [] []] [7 0 [] []]]]
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J("[4 0 [2 0 [1 0 [] []] [3 0 [] []]] [6 0 [5 0 [] []] [7 0 [] []]]] 4 Tree-Delete ")
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
from notebook_preamble import J, V, define
|
||||
|
||||
@@ -81,13 +81,13 @@ the variables:
|
||||
The three arguments are to the left, so we can “chop off” everything to
|
||||
the right and say it’s the definition of the ``quadratic`` function:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('quadratic == over [[[neg] dupdip sqr 4] dipd * * - sqrt pm] dip 2 * [/] cons app2')
|
||||
|
||||
Let’s try it out:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('3 1 1 quadratic')
|
||||
|
||||
@@ -102,7 +102,7 @@ lines are the ``dip`` and ``dipd`` combinators building the main program
|
||||
by incorporating the values on the stack. Then that program runs and you
|
||||
get the results. This is pretty typical of Joy code.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
V('-5 1 4 quadratic')
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
from notebook_preamble import D, DefinitionWrapper, J, V, define
|
||||
|
||||
@@ -80,7 +80,7 @@ is a recursive function ``H :: A -> C`` that converts a value of type
|
||||
It may be helpful to see this function implemented in imperative Python
|
||||
code.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def hylomorphism(c, F, P, G):
|
||||
'''Return a hylomorphism function H.'''
|
||||
@@ -185,7 +185,7 @@ the left so we have a definition for ``hylomorphism``:
|
||||
|
||||
hylomorphism == [unit [pop] swoncat] dipd [dip] swoncat genrec
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('hylomorphism == [unit [pop] swoncat] dipd [dip] swoncat genrec')
|
||||
|
||||
@@ -203,13 +203,13 @@ To sum a range of integers from 0 to *n* - 1:
|
||||
- ``[G]`` is ``[-- dup]``
|
||||
- ``[F]`` is ``[+]``
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('triangular_number == [1 <=] 0 [-- dup] [+] hylomorphism')
|
||||
|
||||
Let’s try it:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('5 triangular_number')
|
||||
|
||||
@@ -219,7 +219,7 @@ Let’s try it:
|
||||
10
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[0 1 2 3 4 5 6] [triangular_number] map')
|
||||
|
||||
@@ -405,11 +405,11 @@ Each of the above variations can be used to make four slightly different
|
||||
H1 == [P] [pop c] [G] [dip F] genrec
|
||||
== [0 <=] [pop []] [-- dup] [dip swons] genrec
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('range == [0 <=] [] [-- dup] [swons] hylomorphism')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('5 range')
|
||||
|
||||
@@ -427,11 +427,11 @@ Each of the above variations can be used to make four slightly different
|
||||
H2 == c swap [P] [pop] [G [F] dip] primrec
|
||||
== [] swap [0 <=] [pop] [-- dup [swons] dip] primrec
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('range_reverse == [] swap [0 <=] [pop] [-- dup [swons] dip] primrec')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('5 range_reverse')
|
||||
|
||||
@@ -449,11 +449,11 @@ Each of the above variations can be used to make four slightly different
|
||||
H3 == [P] [pop c] [[G] dupdip] [dip F] genrec
|
||||
== [0 <=] [pop []] [[--] dupdip] [dip swons] genrec
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('ranger == [0 <=] [pop []] [[--] dupdip] [dip swons] genrec')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('5 ranger')
|
||||
|
||||
@@ -471,11 +471,11 @@ Each of the above variations can be used to make four slightly different
|
||||
H4 == c swap [P] [pop] [[F] dupdip G ] primrec
|
||||
== [] swap [0 <=] [pop] [[swons] dupdip --] primrec
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('ranger_reverse == [] swap [0 <=] [pop] [[swons] dupdip --] primrec')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('5 ranger_reverse')
|
||||
|
||||
@@ -501,7 +501,7 @@ and makes some new value.
|
||||
|
||||
C == [not] c [uncons swap] [F] hylomorphism
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('swuncons == uncons swap') # Awkward name.
|
||||
|
||||
@@ -511,11 +511,11 @@ An example of a catamorphism is the sum function.
|
||||
|
||||
sum == [not] 0 [swuncons] [+] hylomorphism
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('sum == [not] 0 [swuncons] [+] hylomorphism')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[5 4 3 2 1] sum')
|
||||
|
||||
@@ -531,7 +531,7 @@ The ``step`` combinator
|
||||
The ``step`` combinator will usually be better to use than
|
||||
``catamorphism``.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[step] help')
|
||||
|
||||
@@ -560,11 +560,11 @@ The ``step`` combinator will usually be better to use than
|
||||
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('sum == 0 swap [+] step')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[5 4 3 2 1] sum')
|
||||
|
||||
@@ -592,11 +592,11 @@ With:
|
||||
G == --
|
||||
P == 1 <=
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('factorial == 1 swap [1 <=] [pop] [[*] dupdip --] primrec')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('5 factorial')
|
||||
|
||||
@@ -635,11 +635,11 @@ We would use:
|
||||
G == rest dup
|
||||
P == not
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('tails == [] swap [not] [pop] [rest dup [swons] dip] primrec')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[1 2 3] tails')
|
||||
|
||||
|
||||
@@ -9,14 +9,14 @@ dictionary. However, there’s no function that does that. Adding a new
|
||||
function to the dictionary is a meta-interpreter action, you have to do
|
||||
it in Python, not Joy.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
from notebook_preamble import D, J, V
|
||||
|
||||
A long trace
|
||||
------------
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
V('[23 18] average')
|
||||
|
||||
@@ -81,7 +81,7 @@ An efficient ``sum`` function is already in the library. But for
|
||||
``size`` we can use a “compiled” version hand-written in Python to speed
|
||||
up evaluation and make the trace more readable.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
from joy.library import SimpleFunctionWrapper
|
||||
from joy.utils.stack import iter_stack
|
||||
@@ -99,7 +99,7 @@ up evaluation and make the trace more readable.
|
||||
Now we replace the old version in the dictionary with the new version,
|
||||
and re-evaluate the expression.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
D['size'] = size
|
||||
|
||||
@@ -108,7 +108,7 @@ A shorter trace
|
||||
|
||||
You can see that ``size`` now executes in a single step.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
V('[23 18] average')
|
||||
|
||||
|
||||
@@ -148,11 +148,11 @@ Working backwards:
|
||||
Define ``treestep``
|
||||
-------------------
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
from notebook_preamble import D, J, V, define, DefinitionWrapper
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
DefinitionWrapper.add_definitions('''
|
||||
|
||||
@@ -173,7 +173,7 @@ all nodes in a tree with this function:
|
||||
|
||||
sumtree == [pop 0] [] [sum +] treestep
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('sumtree == [pop 0] [] [sum +] treestep')
|
||||
|
||||
@@ -185,7 +185,7 @@ Running this function on an empty tree value gives zero:
|
||||
------------------------------------
|
||||
0
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[] sumtree') # Empty tree.
|
||||
|
||||
@@ -205,7 +205,7 @@ Running it on a non-empty node:
|
||||
n m +
|
||||
n+m
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[23] sumtree') # No child trees.
|
||||
|
||||
@@ -215,7 +215,7 @@ Running it on a non-empty node:
|
||||
23
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[23 []] sumtree') # Child tree, empty.
|
||||
|
||||
@@ -225,7 +225,7 @@ Running it on a non-empty node:
|
||||
23
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[23 [2 [4]] [3]] sumtree') # Non-empty child trees.
|
||||
|
||||
@@ -235,7 +235,7 @@ Running it on a non-empty node:
|
||||
32
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[23 [2 [8] [9]] [3] [4 []]] sumtree') # Etc...
|
||||
|
||||
@@ -245,7 +245,7 @@ Running it on a non-empty node:
|
||||
49
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[23 [2 [8] [9]] [3] [4 []]] [pop 0] [] [cons sum] treestep') # Alternate "spelling".
|
||||
|
||||
@@ -255,7 +255,7 @@ Running it on a non-empty node:
|
||||
49
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[23 [2 [8] [9]] [3] [4 []]] [] [pop 23] [cons] treestep') # Replace each node.
|
||||
|
||||
@@ -265,7 +265,7 @@ Running it on a non-empty node:
|
||||
[23 [23 [23] [23]] [23] [23 []]]
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[23 [2 [8] [9]] [3] [4 []]] [] [pop 1] [cons] treestep')
|
||||
|
||||
@@ -275,7 +275,7 @@ Running it on a non-empty node:
|
||||
[1 [1 [1] [1]] [1] [1 []]]
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[23 [2 [8] [9]] [3] [4 []]] [] [pop 1] [cons] treestep sumtree')
|
||||
|
||||
@@ -285,7 +285,7 @@ Running it on a non-empty node:
|
||||
6
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[23 [2 [8] [9]] [3] [4 []]] [pop 0] [pop 1] [sum +] treestep') # Combine replace and sum into one function.
|
||||
|
||||
@@ -295,7 +295,7 @@ Running it on a non-empty node:
|
||||
6
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[4 [3 [] [7]]] [pop 0] [pop 1] [sum +] treestep') # Combine replace and sum into one function.
|
||||
|
||||
@@ -339,7 +339,7 @@ Traversal
|
||||
|
||||
This doesn’t quite work:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[[3 0] [[2 0] [][]] [[9 0] [[5 0] [[4 0] [][]] [[8 0] [[6 0] [] [[7 0] [][]]][]]][]]] ["B"] [first] [i] treestep')
|
||||
|
||||
@@ -369,7 +369,7 @@ So:
|
||||
|
||||
[] [first] [flatten cons] treestep
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [first] [flatten cons] treestep')
|
||||
|
||||
@@ -401,7 +401,7 @@ So:
|
||||
|
||||
[] [i roll< swons concat] [first] treestep
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [uncons pop] [i roll< swons concat] treestep')
|
||||
|
||||
@@ -429,7 +429,7 @@ Plugging in our BTree structure:
|
||||
|
||||
[key value] N [left right] [K] C
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[["key" "value"] ["left"] ["right"] ] ["B"] ["N"] ["C"] treegrind')
|
||||
|
||||
@@ -444,7 +444,7 @@ Plugging in our BTree structure:
|
||||
|
||||
Iteration through the nodes
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [pop] ["N"] [step] treegrind')
|
||||
|
||||
@@ -456,7 +456,7 @@ Iteration through the nodes
|
||||
|
||||
Sum the nodes’ keys.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('0 [[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [pop] [first +] [step] treegrind')
|
||||
|
||||
@@ -468,7 +468,7 @@ Sum the nodes’ keys.
|
||||
|
||||
Rebuild the tree using ``map`` (imitating ``treestep``.)
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [[100 +] infra] [map cons] treegrind')
|
||||
|
||||
@@ -574,7 +574,7 @@ Putting it together
|
||||
|
||||
To me, that seems simpler than the ``genrec`` version.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
DefinitionWrapper.add_definitions('''
|
||||
|
||||
@@ -587,7 +587,7 @@ To me, that seems simpler than the ``genrec`` version.
|
||||
|
||||
''', D)
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('''\
|
||||
|
||||
@@ -603,7 +603,7 @@ To me, that seems simpler than the ``genrec`` version.
|
||||
15
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('''\
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Type Checking
|
||||
=============
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
import logging, sys
|
||||
|
||||
@@ -11,7 +11,7 @@ Type Checking
|
||||
level=logging.INFO,
|
||||
)
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
from joy.utils.types import (
|
||||
doc_from_stack_effect,
|
||||
@@ -22,7 +22,7 @@ Type Checking
|
||||
JoyTypeError,
|
||||
)
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
D = FUNCTIONS.copy()
|
||||
del D['product']
|
||||
@@ -31,7 +31,7 @@ Type Checking
|
||||
An Example
|
||||
----------
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
fi, fo = infer(pop, swap, rolldown, rrest, ccons)[0]
|
||||
|
||||
@@ -46,7 +46,7 @@ An Example
|
||||
40 ([a4 a5 ...1] a3 a2 a1 -- [a2 a3 ...1]) ∘
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
print doc_from_stack_effect(fi, fo)
|
||||
|
||||
@@ -56,13 +56,13 @@ An Example
|
||||
([a4 a5 ...1] a3 a2 a1 -- [a2 a3 ...1])
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
from joy.parser import text_to_expression
|
||||
from joy.utils.stack import stack_to_string
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
e = text_to_expression('0 1 2 [3 4]') # reverse order
|
||||
print stack_to_string(e)
|
||||
@@ -73,7 +73,7 @@ An Example
|
||||
[3 4] 2 1 0
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
u = unify(e, fi)[0]
|
||||
u
|
||||
@@ -87,7 +87,7 @@ An Example
|
||||
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
g = reify(u, (fi, fo))
|
||||
print doc_from_stack_effect(*g)
|
||||
@@ -101,11 +101,11 @@ An Example
|
||||
Unification Works “in Reverse”
|
||||
------------------------------
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
e = text_to_expression('[2 3]')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
u = unify(e, fo)[0] # output side, not input side
|
||||
u
|
||||
@@ -119,7 +119,7 @@ Unification Works “in Reverse”
|
||||
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
g = reify(u, (fi, fo))
|
||||
print doc_from_stack_effect(*g)
|
||||
@@ -133,7 +133,7 @@ Unification Works “in Reverse”
|
||||
Failing a Check
|
||||
---------------
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
fi, fo = infer(dup, mul)[0]
|
||||
|
||||
@@ -146,7 +146,7 @@ Failing a Check
|
||||
31 (i1 -- i2) ∘
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
e = text_to_expression('"two"')
|
||||
print stack_to_string(e)
|
||||
@@ -157,7 +157,7 @@ Failing a Check
|
||||
'two'
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
try:
|
||||
unify(e, fi)
|
||||
|
||||
@@ -184,7 +184,7 @@ Compiling ``pop∘swap∘roll<``
|
||||
|
||||
The simplest way to “compile” this function would be something like:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def poswrd(s, e, d):
|
||||
return rolldown(*swap(*pop(s, e, d)))
|
||||
@@ -200,7 +200,7 @@ Looking ahead for a moment, from the stack effect comment:
|
||||
|
||||
We should be able to directly write out a Python function like:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def poswrd(stack):
|
||||
(_, (a, (b, (c, stack)))) = stack
|
||||
@@ -393,7 +393,7 @@ And there you have it, the stack effect for
|
||||
From this stack effect comment it should be possible to construct the
|
||||
following Python code:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def F(stack):
|
||||
(_, (d, (c, ((a, (b, S0)), stack)))) = stack
|
||||
@@ -408,7 +408,7 @@ Representing Stack Effect Comments in Python
|
||||
I’m going to use pairs of tuples of type descriptors, which will be
|
||||
integers or tuples of type descriptors:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
roll_dn = (1, 2, 3), (2, 3, 1)
|
||||
|
||||
@@ -419,7 +419,7 @@ integers or tuples of type descriptors:
|
||||
``compose()``
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def compose(f, g):
|
||||
|
||||
@@ -465,7 +465,7 @@ integers or tuples of type descriptors:
|
||||
``unify()``
|
||||
~~~~~~~~~~~
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def unify(u, v, s=None):
|
||||
if s is None:
|
||||
@@ -483,7 +483,7 @@ integers or tuples of type descriptors:
|
||||
``update()``
|
||||
~~~~~~~~~~~~
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def update(s, term):
|
||||
if not isinstance(term, tuple):
|
||||
@@ -493,7 +493,7 @@ integers or tuples of type descriptors:
|
||||
``relabel()``
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def relabel(left, right):
|
||||
return left, _1000(right)
|
||||
@@ -517,7 +517,7 @@ integers or tuples of type descriptors:
|
||||
``delabel()``
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def delabel(f):
|
||||
s = {u: i for i, u in enumerate(sorted(_unique(f)))}
|
||||
@@ -551,7 +551,7 @@ At last we put it all together in a function ``C()`` that accepts two
|
||||
stack effect comments and returns their composition (or raises and
|
||||
exception if they can’t be composed due to type conflicts.)
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def C(f, g):
|
||||
f, g = relabel(f, g)
|
||||
@@ -560,7 +560,7 @@ exception if they can’t be composed due to type conflicts.)
|
||||
|
||||
Let’s try it out.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
C(pop, swap)
|
||||
|
||||
@@ -573,7 +573,7 @@ Let’s try it out.
|
||||
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
C(C(pop, swap), roll_dn)
|
||||
|
||||
@@ -586,7 +586,7 @@ Let’s try it out.
|
||||
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
C(swap, roll_dn)
|
||||
|
||||
@@ -599,7 +599,7 @@ Let’s try it out.
|
||||
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
C(pop, C(swap, roll_dn))
|
||||
|
||||
@@ -612,7 +612,7 @@ Let’s try it out.
|
||||
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
poswrd = reduce(C, (pop, swap, roll_dn))
|
||||
poswrd
|
||||
@@ -633,13 +633,13 @@ Here’s that trick to represent functions like ``rest`` and ``cons`` that
|
||||
manipulate stacks. We use a cons-list of tuples and give the tails their
|
||||
own numbers. Then everything above already works.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
rest = ((1, 2),), (2,)
|
||||
|
||||
cons = (1, 2), ((1, 2),)
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
C(poswrd, rest)
|
||||
|
||||
@@ -671,7 +671,7 @@ The translation table, if you will, would be:
|
||||
0: 0,
|
||||
}
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
F = reduce(C, (pop, swap, roll_dn, rest, rest, cons, cons))
|
||||
|
||||
@@ -699,11 +699,11 @@ Dealing with ``cons`` and ``uncons``
|
||||
However, if we try to compose e.g. ``cons`` and ``uncons`` it won’t
|
||||
work:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
uncons = ((1, 2),), (1, 2)
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
try:
|
||||
C(cons, uncons)
|
||||
@@ -723,7 +723,7 @@ The problem is that the ``unify()`` function as written doesn’t handle
|
||||
the case when both terms are tuples. We just have to add a clause to
|
||||
deal with this recursively:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def unify(u, v, s=None):
|
||||
if s is None:
|
||||
@@ -753,7 +753,7 @@ deal with this recursively:
|
||||
|
||||
return s
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
C(cons, uncons)
|
||||
|
||||
@@ -771,7 +771,7 @@ Part III: Compiling Yin Functions
|
||||
|
||||
Now consider the Python function we would like to derive:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def F_python(stack):
|
||||
(_, (d, (c, ((a, (b, S0)), stack)))) = stack
|
||||
@@ -779,7 +779,7 @@ Now consider the Python function we would like to derive:
|
||||
|
||||
And compare it to the input stack effect comment tuple we just computed:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
F[0]
|
||||
|
||||
@@ -816,7 +816,7 @@ Eh?
|
||||
|
||||
And the return tuple
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
F[1]
|
||||
|
||||
@@ -848,7 +848,7 @@ Python Identifiers
|
||||
We want to substitute Python identifiers for the integers. I’m going to
|
||||
repurpose ``joy.parser.Symbol`` class for this:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
from collections import defaultdict
|
||||
from joy.parser import Symbol
|
||||
@@ -874,7 +874,7 @@ effect comment tuples to reasonable text format. There are some details
|
||||
in how this code works that related to stuff later in the notebook, so
|
||||
you should skip it for now and read it later if you’re interested.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def doc_from_stack_effect(inputs, outputs):
|
||||
return '(%s--%s)' % (
|
||||
@@ -914,7 +914,7 @@ Now we can write a compiler function to emit Python source code. (The
|
||||
underscore suffix distiguishes it from the built-in ``compile()``
|
||||
function.)
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def compile_(name, f, doc=None):
|
||||
if doc is None:
|
||||
@@ -932,7 +932,7 @@ function.)
|
||||
|
||||
Here it is in action:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
source = compile_('F', F)
|
||||
|
||||
@@ -949,7 +949,7 @@ Here it is in action:
|
||||
|
||||
Compare:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def F_python(stack):
|
||||
(_, (d, (c, ((a, (b, S0)), stack)))) = stack
|
||||
@@ -957,7 +957,7 @@ Compare:
|
||||
|
||||
Next steps:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
L = {}
|
||||
|
||||
@@ -976,16 +976,16 @@ Next steps:
|
||||
|
||||
Let’s try it out:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
from notebook_preamble import D, J, V
|
||||
from joy.library import SimpleFunctionWrapper
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
D['F'] = SimpleFunctionWrapper(L['F'])
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[4 5 ...] 2 3 1 F')
|
||||
|
||||
@@ -1012,7 +1012,7 @@ Compiling Library Functions
|
||||
We can use ``compile_()`` to generate many primitives in the library
|
||||
from their stack effect comments:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def defs():
|
||||
|
||||
@@ -1036,7 +1036,7 @@ from their stack effect comments:
|
||||
|
||||
return locals()
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
for name, stack_effect_comment in sorted(defs().items()):
|
||||
print
|
||||
@@ -1205,7 +1205,7 @@ Python class hierarchy of Joy types and use the ``issubclass()`` method
|
||||
to establish domain ordering, as well as other handy behaviour that will
|
||||
make it fairly easy to reuse most of the code above.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
class AnyJoyType(object):
|
||||
|
||||
@@ -1251,14 +1251,14 @@ make it fairly easy to reuse most of the code above.
|
||||
|
||||
Mess with it a little:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
from itertools import permutations
|
||||
|
||||
“Any” types can be specialized to numbers and stacks, but not vice
|
||||
versa:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
for a, b in permutations((A[0], N[0], S[0]), 2):
|
||||
print a, '>=', b, '->', a >= b
|
||||
@@ -1278,7 +1278,7 @@ Our crude `Numerical
|
||||
Tower <https://en.wikipedia.org/wiki/Numerical_tower>`__ of *numbers* >
|
||||
*floats* > *integers* works as well (but we’re not going to use it yet):
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
for a, b in permutations((A[0], N[0], FloatJoyType(0), IntJoyType(0)), 2):
|
||||
print a, '>=', b, '->', a >= b
|
||||
@@ -1303,13 +1303,13 @@ Tower <https://en.wikipedia.org/wiki/Numerical_tower>`__ of *numbers* >
|
||||
Typing ``sqr``
|
||||
~~~~~~~~~~~~~~
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
dup = (A[1],), (A[1], A[1])
|
||||
|
||||
mul = (N[1], N[2]), (N[3],)
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
dup
|
||||
|
||||
@@ -1322,7 +1322,7 @@ Typing ``sqr``
|
||||
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
mul
|
||||
|
||||
@@ -1340,7 +1340,7 @@ Modifying the Inferencer
|
||||
|
||||
Re-labeling still works fine:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
foo = relabel(dup, mul)
|
||||
|
||||
@@ -1361,7 +1361,7 @@ Re-labeling still works fine:
|
||||
The ``delabel()`` function needs an overhaul. It now has to keep track
|
||||
of how many labels of each domain it has “seen”.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
from collections import Counter
|
||||
|
||||
@@ -1383,7 +1383,7 @@ of how many labels of each domain it has “seen”.
|
||||
|
||||
return tuple(delabel(inner, seen, c) for inner in f)
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
delabel(foo)
|
||||
|
||||
@@ -1399,7 +1399,7 @@ of how many labels of each domain it has “seen”.
|
||||
``unify()`` version 3
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def unify(u, v, s=None):
|
||||
if s is None:
|
||||
@@ -1449,7 +1449,7 @@ of how many labels of each domain it has “seen”.
|
||||
|
||||
Rewrite the stack effect comments:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def defs():
|
||||
|
||||
@@ -1503,11 +1503,11 @@ Rewrite the stack effect comments:
|
||||
|
||||
return locals()
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
DEFS = defs()
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
for name, stack_effect_comment in sorted(DEFS.items()):
|
||||
print name, '=', doc_from_stack_effect(*stack_effect_comment)
|
||||
@@ -1543,14 +1543,14 @@ Rewrite the stack effect comments:
|
||||
uncons = ([a1 .1.] -- a1 [.1.])
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
globals().update(DEFS)
|
||||
|
||||
Compose ``dup`` and ``mul``
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
C(dup, mul)
|
||||
|
||||
@@ -1565,7 +1565,7 @@ Compose ``dup`` and ``mul``
|
||||
|
||||
Revisit the ``F`` function, works fine.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
F = reduce(C, (pop, swap, rolldown, rest, rest, cons, cons))
|
||||
F
|
||||
@@ -1579,7 +1579,7 @@ Revisit the ``F`` function, works fine.
|
||||
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
print doc_from_stack_effect(*F)
|
||||
|
||||
@@ -1592,12 +1592,12 @@ Revisit the ``F`` function, works fine.
|
||||
Some otherwise inefficient functions are no longer to be feared. We can
|
||||
also get the effect of combinators in some limited cases.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def neato(*funcs):
|
||||
print doc_from_stack_effect(*reduce(C, funcs))
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
# e.g. [swap] dip
|
||||
neato(rollup, swap, rolldown)
|
||||
@@ -1608,7 +1608,7 @@ also get the effect of combinators in some limited cases.
|
||||
(a1 a2 a3 -- a2 a1 a3)
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
# e.g. [popop] dipd
|
||||
neato(popdd, rolldown, pop)
|
||||
@@ -1619,7 +1619,7 @@ also get the effect of combinators in some limited cases.
|
||||
(a1 a2 a3 a4 -- a3 a4)
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
# Reverse the order of the top three items.
|
||||
neato(rollup, swap)
|
||||
@@ -1636,7 +1636,7 @@ also get the effect of combinators in some limited cases.
|
||||
Because the type labels represent themselves as valid Python identifiers
|
||||
the ``compile_()`` function doesn’t need to generate them anymore:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def compile_(name, f, doc=None):
|
||||
inputs, outputs = f
|
||||
@@ -1652,7 +1652,7 @@ the ``compile_()`` function doesn’t need to generate them anymore:
|
||||
%s = stack
|
||||
return %s''' % (name, doc, i, o)
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
print compile_('F', F)
|
||||
|
||||
@@ -1668,7 +1668,7 @@ the ``compile_()`` function doesn’t need to generate them anymore:
|
||||
But it cannot magically create new functions that involve e.g. math and
|
||||
such. Note that this is *not* a ``sqr`` function implementation:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
print compile_('sqr', C(dup, mul))
|
||||
|
||||
@@ -1696,7 +1696,7 @@ The functions that *can* be compiled are the ones that have only
|
||||
``AnyJoyType`` and ``StackJoyType`` labels in their stack effect
|
||||
comments. We can write a function to check that:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
from itertools import imap
|
||||
|
||||
@@ -1704,7 +1704,7 @@ comments. We can write a function to check that:
|
||||
def compilable(f):
|
||||
return isinstance(f, tuple) and all(imap(compilable, f)) or stacky(f)
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
for name, stack_effect_comment in sorted(defs().items()):
|
||||
if compilable(stack_effect_comment):
|
||||
@@ -1828,7 +1828,7 @@ the “truthiness” of ``StackJoyType`` to false to let e.g.
|
||||
``joy.utils.stack.concat`` work with our stack effect comment cons-list
|
||||
tuples.)
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def compose(f, g):
|
||||
(f_in, f_out), (g_in, g_out) = f, g
|
||||
@@ -1840,7 +1840,7 @@ tuples.)
|
||||
I don’t want to rewrite all the defs myself, so I’ll write a little
|
||||
conversion function instead. This is programmer’s laziness.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def sequence_to_stack(seq, stack=StackJoyType(23)):
|
||||
for item in seq: stack = item, stack
|
||||
@@ -1854,7 +1854,7 @@ conversion function instead. This is programmer’s laziness.
|
||||
NEW_DEFS['swaack'] = (S[1], S[0]), (S[0], S[1])
|
||||
globals().update(NEW_DEFS)
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
C(stack, uncons)
|
||||
|
||||
@@ -1867,7 +1867,7 @@ conversion function instead. This is programmer’s laziness.
|
||||
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
reduce(C, (stack, uncons, uncons))
|
||||
|
||||
@@ -1887,7 +1887,7 @@ The display function should be changed too.
|
||||
|
||||
Clunky junk, but it will suffice for now.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def doc_from_stack_effect(inputs, outputs):
|
||||
switch = [False] # Do we need to display the '...' for the rest of the main stack?
|
||||
@@ -1935,7 +1935,7 @@ Clunky junk, but it will suffice for now.
|
||||
a.append(end)
|
||||
return '[%s]' % ' '.join(a)
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
for name, stack_effect_comment in sorted(NEW_DEFS.items()):
|
||||
print name, '=', doc_from_stack_effect(*stack_effect_comment)
|
||||
@@ -1973,7 +1973,7 @@ Clunky junk, but it will suffice for now.
|
||||
uncons = ([a1 .1.] -- a1 [.1.])
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
print ; print doc_from_stack_effect(*stack)
|
||||
print ; print doc_from_stack_effect(*C(stack, uncons))
|
||||
@@ -1993,7 +1993,7 @@ Clunky junk, but it will suffice for now.
|
||||
(... a1 -- ... a1 [a1 ...])
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
print doc_from_stack_effect(*C(ccons, stack))
|
||||
|
||||
@@ -2003,7 +2003,7 @@ Clunky junk, but it will suffice for now.
|
||||
(... a2 a1 [.1.] -- ... [a2 a1 .1.] [[a2 a1 .1.] ...])
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
Q = C(ccons, stack)
|
||||
|
||||
@@ -2024,7 +2024,7 @@ Clunky junk, but it will suffice for now.
|
||||
This makes the ``compile_()`` function pretty simple as the stack effect
|
||||
comments are now already in the form needed for the Python code:
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def compile_(name, f, doc=None):
|
||||
i, o = f
|
||||
@@ -2035,7 +2035,7 @@ comments are now already in the form needed for the Python code:
|
||||
%s = stack
|
||||
return %s''' % (name, doc, i, o)
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
print compile_('Q', Q)
|
||||
|
||||
@@ -2053,12 +2053,12 @@ comments are now already in the form needed for the Python code:
|
||||
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
unstack = (S[1], S[0]), S[1]
|
||||
enstacken = S[0], (S[0], S[1])
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
print doc_from_stack_effect(*unstack)
|
||||
|
||||
@@ -2068,7 +2068,7 @@ comments are now already in the form needed for the Python code:
|
||||
([.1.] --)
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
print doc_from_stack_effect(*enstacken)
|
||||
|
||||
@@ -2078,7 +2078,7 @@ comments are now already in the form needed for the Python code:
|
||||
(-- [.0.])
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
print doc_from_stack_effect(*C(cons, unstack))
|
||||
|
||||
@@ -2088,7 +2088,7 @@ comments are now already in the form needed for the Python code:
|
||||
(a1 [.1.] -- a1)
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
print doc_from_stack_effect(*C(cons, enstacken))
|
||||
|
||||
@@ -2098,7 +2098,7 @@ comments are now already in the form needed for the Python code:
|
||||
(a1 [.1.] -- [[a1 .1.] .2.])
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
C(cons, unstack)
|
||||
|
||||
@@ -2117,7 +2117,7 @@ Part VI: Multiple Stack Effects
|
||||
|
||||
…
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
class IntJoyType(NumberJoyType): prefix = 'i'
|
||||
|
||||
@@ -2125,7 +2125,7 @@ Part VI: Multiple Stack Effects
|
||||
F = map(FloatJoyType, _R)
|
||||
I = map(IntJoyType, _R)
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
muls = [
|
||||
((I[2], (I[1], S[0])), (I[3], S[0])),
|
||||
@@ -2134,7 +2134,7 @@ Part VI: Multiple Stack Effects
|
||||
((F[2], (F[1], S[0])), (F[3], S[0])),
|
||||
]
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
for f in muls:
|
||||
print doc_from_stack_effect(*f)
|
||||
@@ -2148,7 +2148,7 @@ Part VI: Multiple Stack Effects
|
||||
(f1 f2 -- f3)
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
for f in muls:
|
||||
try:
|
||||
@@ -2164,7 +2164,7 @@ Part VI: Multiple Stack Effects
|
||||
(a1 -- a1 a1) (f1 f2 -- f3) (f1 -- f2)
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
from itertools import product
|
||||
|
||||
@@ -2180,7 +2180,7 @@ Part VI: Multiple Stack Effects
|
||||
def MC(F, G):
|
||||
return sorted(set(meta_compose(F, G)))
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
for f in MC([dup], [mul]):
|
||||
print doc_from_stack_effect(*f)
|
||||
@@ -2191,7 +2191,7 @@ Part VI: Multiple Stack Effects
|
||||
(n1 -- n2)
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
for f in MC([dup], muls):
|
||||
print doc_from_stack_effect(*f)
|
||||
@@ -2264,7 +2264,7 @@ Giving us two unifiers:
|
||||
{c: a, d: b, .1.: .0.}
|
||||
{c: a, d: e, .1.: A* b .0.}
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
class KleeneStar(object):
|
||||
|
||||
@@ -2314,7 +2314,7 @@ Giving us two unifiers:
|
||||
|
||||
Can now return multiple results…
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def unify(u, v, s=None):
|
||||
if s is None:
|
||||
@@ -2386,7 +2386,7 @@ Can now return multiple results…
|
||||
def stacky(thing):
|
||||
return thing.__class__ in {AnyJoyType, StackJoyType}
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
a = (As[1], S[1])
|
||||
a
|
||||
@@ -2400,7 +2400,7 @@ Can now return multiple results…
|
||||
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
b = (A[1], S[2])
|
||||
b
|
||||
@@ -2414,7 +2414,7 @@ Can now return multiple results…
|
||||
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
for result in unify(b, a):
|
||||
print result, '->', update(result, a), update(result, b)
|
||||
@@ -2426,7 +2426,7 @@ Can now return multiple results…
|
||||
{a1: a10001, s2: (a1*, s1)} -> (a1*, s1) (a10001, (a1*, s1))
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
for result in unify(a, b):
|
||||
print result, '->', update(result, a), update(result, b)
|
||||
@@ -2446,7 +2446,7 @@ Can now return multiple results…
|
||||
|
||||
(a1*, s1) [a1*] (a2, (a1*, s1)) [a2 a1*]
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
sum_ = ((Ns[1], S[1]), S[0]), (N[0], S[0])
|
||||
|
||||
@@ -2458,7 +2458,7 @@ Can now return multiple results…
|
||||
([n1* .1.] -- n0)
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
f = (N[1], (N[2], (N[3], S[1]))), S[0]
|
||||
|
||||
@@ -2470,7 +2470,7 @@ Can now return multiple results…
|
||||
(-- [n1 n2 n3 .1.])
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
for result in unify(sum_[0], f):
|
||||
print result, '->', update(result, sum_[1])
|
||||
@@ -2489,7 +2489,7 @@ Can now return multiple results…
|
||||
|
||||
This function has to be modified to yield multiple results.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def compose(f, g):
|
||||
(f_in, f_out), (g_in, g_out) = f, g
|
||||
@@ -2501,7 +2501,7 @@ This function has to be modified to yield multiple results.
|
||||
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def meta_compose(F, G):
|
||||
for f, g in product(F, G):
|
||||
@@ -2517,7 +2517,7 @@ This function has to be modified to yield multiple results.
|
||||
for fg in compose(f, g):
|
||||
yield delabel(fg)
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
for f in MC([dup], muls):
|
||||
print doc_from_stack_effect(*f)
|
||||
@@ -2529,7 +2529,7 @@ This function has to be modified to yield multiple results.
|
||||
(i1 -- i2)
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
|
||||
|
||||
@@ -2542,7 +2542,7 @@ This function has to be modified to yield multiple results.
|
||||
([n1* .1.] -- [n1* .1.] n1)
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
|
||||
|
||||
@@ -2556,7 +2556,7 @@ This function has to be modified to yield multiple results.
|
||||
(n1 [n1* .1.] -- n2)
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
sum_ = (((N[1], (Ns[1], S[1])), S[0]), (N[0], S[0]))
|
||||
print doc_from_stack_effect(*cons),
|
||||
@@ -2571,7 +2571,7 @@ This function has to be modified to yield multiple results.
|
||||
(a1 [.1.] -- [a1 .1.]) ([n1 n1* .1.] -- n0) (n1 [n1* .1.] -- n2)
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
a = (A[4], (As[1], (A[3], S[1])))
|
||||
a
|
||||
@@ -2585,7 +2585,7 @@ This function has to be modified to yield multiple results.
|
||||
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
b = (A[1], (A[2], S[2]))
|
||||
b
|
||||
@@ -2599,7 +2599,7 @@ This function has to be modified to yield multiple results.
|
||||
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
for result in unify(b, a):
|
||||
print result
|
||||
@@ -2611,7 +2611,7 @@ This function has to be modified to yield multiple results.
|
||||
{a1: a4, s2: (a1*, (a3, s1)), a2: a10003}
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
for result in unify(a, b):
|
||||
print result
|
||||
@@ -2681,7 +2681,7 @@ We need a type variable for Joy functions that can go in our expressions
|
||||
and be used by the hybrid inferencer/interpreter. They have to store a
|
||||
name and a list of stack effects.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
class FunctionJoyType(AnyJoyType):
|
||||
|
||||
@@ -2703,14 +2703,14 @@ Specialized for Simple Functions and Combinators
|
||||
For non-combinator functions the stack effects list contains stack
|
||||
effect comments (represented by pairs of cons-lists as described above.)
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
class SymbolJoyType(FunctionJoyType):
|
||||
prefix = 'F'
|
||||
|
||||
For combinators the list contains Python functions.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
class CombinatorJoyType(FunctionJoyType):
|
||||
|
||||
@@ -2731,7 +2731,7 @@ For combinators the list contains Python functions.
|
||||
For simple combinators that have only one effect (like ``dip``) you only
|
||||
need one function and it can be the combinator itself.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
import joy.library
|
||||
|
||||
@@ -2741,7 +2741,7 @@ For combinators that can have more than one effect (like ``branch``) you
|
||||
have to write functions that each implement the action of one of the
|
||||
effects.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def branch_true(stack, expression, dictionary):
|
||||
(then, (else_, (flag, stack))) = stack
|
||||
@@ -2771,7 +2771,7 @@ updated along with the stack effects after doing unification or we risk
|
||||
losing useful information. This was a straightforward, if awkward,
|
||||
modification to the call structure of ``meta_compose()`` et. al.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
ID = S[0], S[0] # Identity function.
|
||||
|
||||
@@ -2833,7 +2833,7 @@ cruft to convert the definitions in ``DEFS`` to the new
|
||||
``SymbolJoyType`` objects, and some combinators. Here is an example of
|
||||
output from the current code :
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
1/0 # (Don't try to run this cell! It's not going to work. This is "read only" code heh..)
|
||||
|
||||
@@ -2956,7 +2956,7 @@ module. But if you’re interested in all that you should just use Prolog!
|
||||
|
||||
Anyhow, type *checking* is a few easy steps away.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
def _ge(self, other):
|
||||
return (issubclass(other.__class__, self.__class__)
|
||||
|
||||
@@ -10,7 +10,7 @@ Huet <https://www.st.cs.uni-saarland.de/edu/seminare/2005/advanced-fp/docs/huet-
|
||||
Given a datastructure on the stack we can navigate through it, modify
|
||||
it, and rebuild it using the “zipper” technique.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
from notebook_preamble import J, V, define
|
||||
|
||||
@@ -23,7 +23,7 @@ strings, Symbols (strings that are names of functions) and sequences
|
||||
`trees <https://en.wikipedia.org/wiki/Tree_%28data_structure%29>`__ out
|
||||
of sequences.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[1 [2 [3 4 25 6] 7] 8]')
|
||||
|
||||
@@ -54,14 +54,14 @@ show the trace so you can see how it works. If we were going to use
|
||||
these a lot it would make sense to write Python versions for efficiency,
|
||||
but see below.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('z-down == [] swap uncons swap')
|
||||
define('z-up == swons swap shunt')
|
||||
define('z-right == [swons] cons dip uncons swap')
|
||||
define('z-left == swons [uncons swap] dip swap')
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
V('[1 [2 [3 4 25 6] 7] 8] z-down')
|
||||
|
||||
@@ -77,7 +77,7 @@ but see below.
|
||||
[] [[2 [3 4 25 6] 7] 8] 1 .
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
V('[] [[2 [3 4 25 6] 7] 8] 1 z-right')
|
||||
|
||||
@@ -101,7 +101,7 @@ but see below.
|
||||
[1] [8] [2 [3 4 25 6] 7] .
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[1] [8] [2 [3 4 25 6] 7] z-down')
|
||||
|
||||
@@ -111,7 +111,7 @@ but see below.
|
||||
[1] [8] [] [[3 4 25 6] 7] 2
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[1] [8] [] [[3 4 25 6] 7] 2 z-right')
|
||||
|
||||
@@ -121,7 +121,7 @@ but see below.
|
||||
[1] [8] [2] [7] [3 4 25 6]
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[1] [8] [2] [7] [3 4 25 6] z-down')
|
||||
|
||||
@@ -131,7 +131,7 @@ but see below.
|
||||
[1] [8] [2] [7] [] [4 25 6] 3
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[1] [8] [2] [7] [] [4 25 6] 3 z-right')
|
||||
|
||||
@@ -141,7 +141,7 @@ but see below.
|
||||
[1] [8] [2] [7] [3] [25 6] 4
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[1] [8] [2] [7] [3] [25 6] 4 z-right')
|
||||
|
||||
@@ -151,7 +151,7 @@ but see below.
|
||||
[1] [8] [2] [7] [4 3] [6] 25
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[1] [8] [2] [7] [4 3] [6] 25 sqr')
|
||||
|
||||
@@ -161,7 +161,7 @@ but see below.
|
||||
[1] [8] [2] [7] [4 3] [6] 625
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
V('[1] [8] [2] [7] [4 3] [6] 625 z-up')
|
||||
|
||||
@@ -184,7 +184,7 @@ but see below.
|
||||
[1] [8] [2] [7] [3 4 625 6] .
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[1] [8] [2] [7] [3 4 625 6] z-up')
|
||||
|
||||
@@ -194,7 +194,7 @@ but see below.
|
||||
[1] [8] [2 [3 4 625 6] 7]
|
||||
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[1] [8] [2 [3 4 625 6] 7] z-up')
|
||||
|
||||
@@ -210,7 +210,7 @@ but see below.
|
||||
In Joy we have the ``dip`` and ``infra`` combinators which can “target”
|
||||
or “address” any particular item in a Joy tree structure.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
V('[1 [2 [3 4 25 6] 7] 8] [[[[[[sqr] dipd] infra] dip] infra] dip] infra')
|
||||
|
||||
@@ -270,13 +270,13 @@ been embedded in a nested series of quoted programs, e.g.:
|
||||
|
||||
The ``Z`` function isn’t hard to make.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
define('Z == [[] cons cons] step i')
|
||||
|
||||
Here it is in action in a simplified scenario.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
V('1 [2 3 4] Z')
|
||||
|
||||
@@ -314,7 +314,7 @@ Here it is in action in a simplified scenario.
|
||||
|
||||
And here it is doing the main thing.
|
||||
|
||||
.. code:: ipython2
|
||||
.. code:: python
|
||||
|
||||
J('[1 [2 [3 4 25 6] 7] 8] [sqr] [dip dip infra dip infra dip infra] Z')
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
|
||||
<section id="functions-grouped-by-er-function-with-examples">
|
||||
<h1>Functions Grouped by, er, Function with Examples<a class="headerlink" href="#functions-grouped-by-er-function-with-examples" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>from notebook_preamble import J, V
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="kn">import</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<section id="stack-chatter">
|
||||
@@ -48,7 +48,7 @@ static for the duration of the computation. This remains to be done but
|
||||
it’s “off the shelf” technology.)</p>
|
||||
<section id="clear">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">clear</span></code><a class="headerlink" href="#clear" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 2 3 clear')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 2 3 clear'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">nothing</span><span class="p">)</span>
|
||||
@@ -57,13 +57,13 @@ it’s “off the shelf” technology.)</p>
|
||||
</section>
|
||||
<section id="dup-dupd">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">dup</span></code> <code class="docutils literal notranslate"><span class="pre">dupd</span></code><a class="headerlink" href="#dup-dupd" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 2 3 dup')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 2 3 dup'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">3</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 2 3 dupd')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 2 3 dupd'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">2</span> <span class="mi">3</span>
|
||||
@@ -74,27 +74,27 @@ it’s “off the shelf” technology.)</p>
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">enstacken</span></code> <code class="docutils literal notranslate"><span class="pre">disenstacken</span></code> <code class="docutils literal notranslate"><span class="pre">stack</span></code> <code class="docutils literal notranslate"><span class="pre">unstack</span></code><a class="headerlink" href="#enstacken-disenstacken-stack-unstack" title="Permalink to this headline">¶</a></h3>
|
||||
<p>(I may have these paired up wrong. I.e. <code class="docutils literal notranslate"><span class="pre">disenstacken</span></code> should be
|
||||
<code class="docutils literal notranslate"><span class="pre">unstack</span></code> and vice versa.)</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 2 3 enstacken') # Replace the stack with a quote of itself.
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 2 3 enstacken'</span><span class="p">)</span> <span class="c1"># Replace the stack with a quote of itself.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">3</span> <span class="mi">2</span> <span class="mi">1</span><span class="p">]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('4 5 6 [3 2 1] disenstacken') # Unpack a list onto the stack.
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'4 5 6 [3 2 1] disenstacken'</span><span class="p">)</span> <span class="c1"># Unpack a list onto the stack.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">4</span> <span class="mi">5</span> <span class="mi">6</span> <span class="mi">3</span> <span class="mi">2</span> <span class="mi">1</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 2 3 stack') # Get the stack on the stack.
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 2 3 stack'</span><span class="p">)</span> <span class="c1"># Get the stack on the stack.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">2</span> <span class="mi">1</span><span class="p">]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 2 3 [4 5 6] unstack') # Replace the stack with the list on top.
|
||||
# The items appear reversed but they are not,
|
||||
# 4 is on the top of both the list and the stack.
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 2 3 [4 5 6] unstack'</span><span class="p">)</span> <span class="c1"># Replace the stack with the list on top.</span>
|
||||
<span class="c1"># The items appear reversed but they are not,</span>
|
||||
<span class="c1"># 4 is on the top of both the list and the stack.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">6</span> <span class="mi">5</span> <span class="mi">4</span>
|
||||
@@ -103,19 +103,19 @@ it’s “off the shelf” technology.)</p>
|
||||
</section>
|
||||
<section id="pop-popd-popop">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">pop</span></code> <code class="docutils literal notranslate"><span class="pre">popd</span></code> <code class="docutils literal notranslate"><span class="pre">popop</span></code><a class="headerlink" href="#pop-popd-popop" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 2 3 pop')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 2 3 pop'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span> <span class="mi">2</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 2 3 popd')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 2 3 popd'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span> <span class="mi">3</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 2 3 popop')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 2 3 popop'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span>
|
||||
@@ -126,13 +126,13 @@ it’s “off the shelf” technology.)</p>
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">roll<</span></code> <code class="docutils literal notranslate"><span class="pre">rolldown</span></code> <code class="docutils literal notranslate"><span class="pre">roll></span></code> <code class="docutils literal notranslate"><span class="pre">rollup</span></code><a class="headerlink" href="#roll-rolldown-roll-rollup" title="Permalink to this headline">¶</a></h3>
|
||||
<p>The “down” and “up” refer to the movement of two of the top three items
|
||||
(displacing the third.)</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 2 3 roll<')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 2 3 roll<'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">2</span> <span class="mi">3</span> <span class="mi">1</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 2 3 roll>')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 2 3 roll>'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">3</span> <span class="mi">1</span> <span class="mi">2</span>
|
||||
@@ -141,7 +141,7 @@ it’s “off the shelf” technology.)</p>
|
||||
</section>
|
||||
<section id="swap">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">swap</span></code><a class="headerlink" href="#swap" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 2 3 swap')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 2 3 swap'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span> <span class="mi">3</span> <span class="mi">2</span>
|
||||
@@ -150,13 +150,13 @@ it’s “off the shelf” technology.)</p>
|
||||
</section>
|
||||
<section id="tuck-over">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">tuck</span></code> <code class="docutils literal notranslate"><span class="pre">over</span></code><a class="headerlink" href="#tuck-over" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 2 3 tuck')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 2 3 tuck'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span> <span class="mi">3</span> <span class="mi">2</span> <span class="mi">3</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 2 3 over')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 2 3 over'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">2</span>
|
||||
@@ -165,25 +165,25 @@ it’s “off the shelf” technology.)</p>
|
||||
</section>
|
||||
<section id="unit-quoted-unquoted">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">unit</span></code> <code class="docutils literal notranslate"><span class="pre">quoted</span></code> <code class="docutils literal notranslate"><span class="pre">unquoted</span></code><a class="headerlink" href="#unit-quoted-unquoted" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 2 3 unit')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 2 3 unit'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span> <span class="mi">2</span> <span class="p">[</span><span class="mi">3</span><span class="p">]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 2 3 quoted')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 2 3 quoted'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="mi">3</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 [2] 3 unquoted')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 [2] 3 unquoted'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>V('1 [dup] 3 unquoted') # Unquoting evaluates. Be aware.
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'1 [dup] 3 unquoted'</span><span class="p">)</span> <span class="c1"># Unquoting evaluates. Be aware.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="mi">1</span> <span class="p">[</span><span class="n">dup</span><span class="p">]</span> <span class="mi">3</span> <span class="n">unquoted</span>
|
||||
@@ -204,19 +204,19 @@ it’s “off the shelf” technology.)</p>
|
||||
<h2>List words<a class="headerlink" href="#list-words" title="Permalink to this headline">¶</a></h2>
|
||||
<section id="concat-swoncat-shunt">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">concat</span></code> <code class="docutils literal notranslate"><span class="pre">swoncat</span></code> <code class="docutils literal notranslate"><span class="pre">shunt</span></code><a class="headerlink" href="#concat-swoncat-shunt" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1 2 3] [4 5 6] concat')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 2 3] [4 5 6] concat'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span> <span class="mi">5</span> <span class="mi">6</span><span class="p">]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1 2 3] [4 5 6] swoncat')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 2 3] [4 5 6] swoncat'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">4</span> <span class="mi">5</span> <span class="mi">6</span> <span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span><span class="p">]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1 2 3] [4 5 6] shunt')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 2 3] [4 5 6] shunt'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">6</span> <span class="mi">5</span> <span class="mi">4</span> <span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span><span class="p">]</span>
|
||||
@@ -225,19 +225,19 @@ it’s “off the shelf” technology.)</p>
|
||||
</section>
|
||||
<section id="cons-swons-uncons">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">cons</span></code> <code class="docutils literal notranslate"><span class="pre">swons</span></code> <code class="docutils literal notranslate"><span class="pre">uncons</span></code><a class="headerlink" href="#cons-swons-uncons" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 [2 3] cons')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 [2 3] cons'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span><span class="p">]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[2 3] 1 swons')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[2 3] 1 swons'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span><span class="p">]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1 2 3] uncons')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 2 3] uncons'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">3</span><span class="p">]</span>
|
||||
@@ -246,25 +246,25 @@ it’s “off the shelf” technology.)</p>
|
||||
</section>
|
||||
<section id="first-second-third-rest">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">first</span></code> <code class="docutils literal notranslate"><span class="pre">second</span></code> <code class="docutils literal notranslate"><span class="pre">third</span></code> <code class="docutils literal notranslate"><span class="pre">rest</span></code><a class="headerlink" href="#first-second-third-rest" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1 2 3 4] first')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 2 3 4] first'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1 2 3 4] second')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 2 3 4] second'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">2</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1 2 3 4] third')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 2 3 4] third'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">3</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1 2 3 4] rest')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 2 3 4] rest'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span><span class="p">]</span>
|
||||
@@ -273,7 +273,7 @@ it’s “off the shelf” technology.)</p>
|
||||
</section>
|
||||
<section id="flatten">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">flatten</span></code><a class="headerlink" href="#flatten" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[[1] [2 [3] 4] [5 6]] flatten')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[[1] [2 [3] 4] [5 6]] flatten'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span> <span class="mi">2</span> <span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="mi">4</span> <span class="mi">5</span> <span class="mi">6</span><span class="p">]</span>
|
||||
@@ -283,31 +283,31 @@ it’s “off the shelf” technology.)</p>
|
||||
<section id="getitem-at-of-drop-take">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">getitem</span></code> <code class="docutils literal notranslate"><span class="pre">at</span></code> <code class="docutils literal notranslate"><span class="pre">of</span></code> <code class="docutils literal notranslate"><span class="pre">drop</span></code> <code class="docutils literal notranslate"><span class="pre">take</span></code><a class="headerlink" href="#getitem-at-of-drop-take" title="Permalink to this headline">¶</a></h3>
|
||||
<p><code class="docutils literal notranslate"><span class="pre">at</span></code> and <code class="docutils literal notranslate"><span class="pre">getitem</span></code> are the same function. <code class="docutils literal notranslate"><span class="pre">of</span> <span class="pre">==</span> <span class="pre">swap</span> <span class="pre">at</span></code></p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[10 11 12 13 14] 2 getitem')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[10 11 12 13 14] 2 getitem'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">12</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1 2 3 4] 0 at')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 2 3 4] 0 at'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('2 [1 2 3 4] of')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'2 [1 2 3 4] of'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">3</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1 2 3 4] 2 drop')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 2 3 4] 2 drop'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">3</span> <span class="mi">4</span><span class="p">]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1 2 3 4] 2 take') # reverses the order
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 2 3 4] 2 take'</span><span class="p">)</span> <span class="c1"># reverses the order</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">2</span> <span class="mi">1</span><span class="p">]</span>
|
||||
@@ -317,7 +317,7 @@ it’s “off the shelf” technology.)</p>
|
||||
</section>
|
||||
<section id="remove">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">remove</span></code><a class="headerlink" href="#remove" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1 2 3 1 4] 1 remove')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 2 3 1 4] 1 remove'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">2</span> <span class="mi">3</span> <span class="mi">1</span> <span class="mi">4</span><span class="p">]</span>
|
||||
@@ -326,7 +326,7 @@ it’s “off the shelf” technology.)</p>
|
||||
</section>
|
||||
<section id="reverse">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">reverse</span></code><a class="headerlink" href="#reverse" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1 2 3 4] reverse')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 2 3 4] reverse'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">4</span> <span class="mi">3</span> <span class="mi">2</span> <span class="mi">1</span><span class="p">]</span>
|
||||
@@ -335,7 +335,7 @@ it’s “off the shelf” technology.)</p>
|
||||
</section>
|
||||
<section id="size">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">size</span></code><a class="headerlink" href="#size" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1 1 1 1] size')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 1 1 1] size'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">4</span>
|
||||
@@ -347,7 +347,7 @@ it’s “off the shelf” technology.)</p>
|
||||
<p>“Swap stack” swap the list on the top of the stack for the stack, and
|
||||
put the old stack on top of the new one. Think of it as a context
|
||||
switch. Niether of the lists/stacks change their order.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 2 3 [4 5 6] swaack')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 2 3 [4 5 6] swaack'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">6</span> <span class="mi">5</span> <span class="mi">4</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">2</span> <span class="mi">1</span><span class="p">]</span>
|
||||
@@ -356,25 +356,25 @@ switch. Niether of the lists/stacks change their order.</p>
|
||||
</section>
|
||||
<section id="choice-select">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">choice</span></code> <code class="docutils literal notranslate"><span class="pre">select</span></code><a class="headerlink" href="#choice-select" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('23 9 1 choice')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'23 9 1 choice'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">9</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('23 9 0 choice')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'23 9 0 choice'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">23</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[23 9 7] 1 select') # select is basically getitem, should retire it?
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23 9 7] 1 select'</span><span class="p">)</span> <span class="c1"># select is basically getitem, should retire it?</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">9</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[23 9 7] 0 select')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23 9 7] 0 select'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">23</span>
|
||||
@@ -383,13 +383,13 @@ switch. Niether of the lists/stacks change their order.</p>
|
||||
</section>
|
||||
<section id="zip">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">zip</span></code><a class="headerlink" href="#zip" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1 2 3] [6 5 4] zip')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 2 3] [6 5 4] zip'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[[</span><span class="mi">6</span> <span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">5</span> <span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">3</span><span class="p">]]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1 2 3] [6 5 4] zip [sum] map')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 2 3] [6 5 4] zip [sum] map'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">7</span> <span class="mi">7</span> <span class="mi">7</span><span class="p">]</span>
|
||||
@@ -401,7 +401,7 @@ switch. Niether of the lists/stacks change their order.</p>
|
||||
<h2>Math words<a class="headerlink" href="#math-words" title="Permalink to this headline">¶</a></h2>
|
||||
<section id="add">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">+</span></code> <code class="docutils literal notranslate"><span class="pre">add</span></code><a class="headerlink" href="#add" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('23 9 +')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'23 9 +'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">32</span>
|
||||
@@ -410,7 +410,7 @@ switch. Niether of the lists/stacks change their order.</p>
|
||||
</section>
|
||||
<section id="sub">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">-</span></code> <code class="docutils literal notranslate"><span class="pre">sub</span></code><a class="headerlink" href="#sub" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('23 9 -')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'23 9 -'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">14</span>
|
||||
@@ -419,7 +419,7 @@ switch. Niether of the lists/stacks change their order.</p>
|
||||
</section>
|
||||
<section id="mul">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">*</span></code> <code class="docutils literal notranslate"><span class="pre">mul</span></code><a class="headerlink" href="#mul" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('23 9 *')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'23 9 *'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">207</span>
|
||||
@@ -428,37 +428,37 @@ switch. Niether of the lists/stacks change their order.</p>
|
||||
</section>
|
||||
<section id="div-floordiv-truediv">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">/</span></code> <code class="docutils literal notranslate"><span class="pre">div</span></code> <code class="docutils literal notranslate"><span class="pre">floordiv</span></code> <code class="docutils literal notranslate"><span class="pre">truediv</span></code><a class="headerlink" href="#div-floordiv-truediv" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('23 9 /')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'23 9 /'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mf">2.5555555555555554</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('23 -9 truediv')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'23 -9 truediv'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">-</span><span class="mf">2.5555555555555554</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('23 9 div')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'23 9 div'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">2</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('23 9 floordiv')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'23 9 floordiv'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">2</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('23 -9 div')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'23 -9 div'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">-</span><span class="mi">3</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('23 -9 floordiv')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'23 -9 floordiv'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">-</span><span class="mi">3</span>
|
||||
@@ -467,7 +467,7 @@ switch. Niether of the lists/stacks change their order.</p>
|
||||
</section>
|
||||
<section id="mod-modulus-rem-remainder">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">%</span></code> <code class="docutils literal notranslate"><span class="pre">mod</span></code> <code class="docutils literal notranslate"><span class="pre">modulus</span></code> <code class="docutils literal notranslate"><span class="pre">rem</span></code> <code class="docutils literal notranslate"><span class="pre">remainder</span></code><a class="headerlink" href="#mod-modulus-rem-remainder" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('23 9 %')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'23 9 %'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">5</span>
|
||||
@@ -476,7 +476,7 @@ switch. Niether of the lists/stacks change their order.</p>
|
||||
</section>
|
||||
<section id="neg">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">neg</span></code><a class="headerlink" href="#neg" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('23 neg -5 neg')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'23 neg -5 neg'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">-</span><span class="mi">23</span> <span class="mi">5</span>
|
||||
@@ -485,7 +485,7 @@ switch. Niether of the lists/stacks change their order.</p>
|
||||
</section>
|
||||
<section id="pow">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">pow</span></code><a class="headerlink" href="#pow" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('2 10 pow')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'2 10 pow'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1024</span>
|
||||
@@ -494,13 +494,13 @@ switch. Niether of the lists/stacks change their order.</p>
|
||||
</section>
|
||||
<section id="sqr-sqrt">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">sqr</span></code> <code class="docutils literal notranslate"><span class="pre">sqrt</span></code><a class="headerlink" href="#sqr-sqrt" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('23 sqr')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'23 sqr'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">529</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('23 sqrt')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'23 sqrt'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mf">4.795831523312719</span>
|
||||
@@ -509,13 +509,13 @@ switch. Niether of the lists/stacks change their order.</p>
|
||||
</section>
|
||||
<section id="succ-pred">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">++</span></code> <code class="docutils literal notranslate"><span class="pre">succ</span></code> <code class="docutils literal notranslate"><span class="pre">--</span></code> <code class="docutils literal notranslate"><span class="pre">pred</span></code><a class="headerlink" href="#succ-pred" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 ++')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 ++'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">2</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 --')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 --'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">0</span>
|
||||
@@ -524,13 +524,13 @@ switch. Niether of the lists/stacks change their order.</p>
|
||||
</section>
|
||||
<section id="lshift-rshift">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre"><<</span></code> <code class="docutils literal notranslate"><span class="pre">lshift</span></code> <code class="docutils literal notranslate"><span class="pre">>></span></code> <code class="docutils literal notranslate"><span class="pre">rshift</span></code><a class="headerlink" href="#lshift-rshift" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('8 1 <<')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'8 1 <<'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">16</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('8 1 >>')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'8 1 >>'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">4</span>
|
||||
@@ -539,7 +539,7 @@ switch. Niether of the lists/stacks change their order.</p>
|
||||
</section>
|
||||
<section id="average">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">average</span></code><a class="headerlink" href="#average" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1 2 3 5] average')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 2 3 5] average'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mf">2.75</span>
|
||||
@@ -548,19 +548,19 @@ switch. Niether of the lists/stacks change their order.</p>
|
||||
</section>
|
||||
<section id="range-range-to-zero-down-to-zero">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">range</span></code> <code class="docutils literal notranslate"><span class="pre">range_to_zero</span></code> <code class="docutils literal notranslate"><span class="pre">down_to_zero</span></code><a class="headerlink" href="#range-range-to-zero-down-to-zero" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('5 range')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'5 range'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">4</span> <span class="mi">3</span> <span class="mi">2</span> <span class="mi">1</span> <span class="mi">0</span><span class="p">]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('5 range_to_zero')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'5 range_to_zero'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">0</span> <span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span> <span class="mi">5</span><span class="p">]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('5 down_to_zero')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'5 down_to_zero'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">5</span> <span class="mi">4</span> <span class="mi">3</span> <span class="mi">2</span> <span class="mi">1</span> <span class="mi">0</span>
|
||||
@@ -569,7 +569,7 @@ switch. Niether of the lists/stacks change their order.</p>
|
||||
</section>
|
||||
<section id="product">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">product</span></code><a class="headerlink" href="#product" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1 2 3 5] product')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 2 3 5] product'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">30</span>
|
||||
@@ -578,7 +578,7 @@ switch. Niether of the lists/stacks change their order.</p>
|
||||
</section>
|
||||
<section id="sum">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">sum</span></code><a class="headerlink" href="#sum" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1 2 3 5] sum')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 2 3 5] sum'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">11</span>
|
||||
@@ -587,7 +587,7 @@ switch. Niether of the lists/stacks change their order.</p>
|
||||
</section>
|
||||
<section id="min">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">min</span></code><a class="headerlink" href="#min" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1 2 3 5] min')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 2 3 5] min'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span>
|
||||
@@ -596,7 +596,7 @@ switch. Niether of the lists/stacks change their order.</p>
|
||||
</section>
|
||||
<section id="gcd">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">gcd</span></code><a class="headerlink" href="#gcd" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('45 30 gcd')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'45 30 gcd'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">15</span>
|
||||
@@ -607,13 +607,13 @@ switch. Niether of the lists/stacks change their order.</p>
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">least_fraction</span></code><a class="headerlink" href="#least-fraction" title="Permalink to this headline">¶</a></h3>
|
||||
<p>If we represent fractions as a quoted pair of integers [q d] this word
|
||||
reduces them to their … least common factors or whatever.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[45 30] least_fraction')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[45 30] least_fraction'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">3</span> <span class="mi">2</span><span class="p">]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[23 12] least_fraction')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23 12] least_fraction'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">23</span> <span class="mi">12</span><span class="p">]</span>
|
||||
@@ -626,19 +626,19 @@ reduces them to their … least common factors or whatever.</p>
|
||||
<section id="truthy">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">?</span></code> <code class="docutils literal notranslate"><span class="pre">truthy</span></code><a class="headerlink" href="#truthy" title="Permalink to this headline">¶</a></h3>
|
||||
<p>Get the Boolean value of the item on the top of the stack.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('23 truthy')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'23 truthy'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kc">True</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[] truthy') # Python semantics.
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[] truthy'</span><span class="p">)</span> <span class="c1"># Python semantics.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kc">False</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('0 truthy')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'0 truthy'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kc">False</span>
|
||||
@@ -647,7 +647,7 @@ reduces them to their … least common factors or whatever.</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>? == dup truthy
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>V('23 ?')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'23 ?'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> . 23 ?
|
||||
@@ -657,13 +657,13 @@ reduces them to their … least common factors or whatever.</p>
|
||||
23 True .
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[] ?')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[] ?'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[]</span> <span class="kc">False</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('0 ?')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'0 ?'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">0</span> <span class="kc">False</span>
|
||||
@@ -672,7 +672,7 @@ reduces them to their … least common factors or whatever.</p>
|
||||
</section>
|
||||
<section id="and">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">&</span></code> <code class="docutils literal notranslate"><span class="pre">and</span></code><a class="headerlink" href="#and" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('23 9 &')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'23 9 &'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span>
|
||||
@@ -681,7 +681,7 @@ reduces them to their … least common factors or whatever.</p>
|
||||
</section>
|
||||
<section id="ne">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">!=</span></code> <code class="docutils literal notranslate"><span class="pre"><></span></code> <code class="docutils literal notranslate"><span class="pre">ne</span></code><a class="headerlink" href="#ne" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('23 9 !=')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'23 9 !='</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kc">True</span>
|
||||
@@ -694,13 +694,13 @@ reduces them to their … least common factors or whatever.</p>
|
||||
</section>
|
||||
<section id="xor">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">^</span></code> <code class="docutils literal notranslate"><span class="pre">xor</span></code><a class="headerlink" href="#xor" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 1 ^')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 1 ^'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">0</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 0 ^')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 0 ^'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span>
|
||||
@@ -712,7 +712,7 @@ reduces them to their … least common factors or whatever.</p>
|
||||
<h2>Miscellaneous<a class="headerlink" href="#miscellaneous" title="Permalink to this headline">¶</a></h2>
|
||||
<section id="help">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">help</span></code><a class="headerlink" href="#help" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[help] help')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[help] help'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Accepts</span> <span class="n">a</span> <span class="n">quoted</span> <span class="n">symbol</span> <span class="n">on</span> <span class="n">the</span> <span class="n">top</span> <span class="n">of</span> <span class="n">the</span> <span class="n">stack</span> <span class="ow">and</span> <span class="n">prints</span> <span class="n">its</span> <span class="n">docs</span><span class="o">.</span>
|
||||
@@ -721,13 +721,13 @@ reduces them to their … least common factors or whatever.</p>
|
||||
</section>
|
||||
<section id="parse">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">parse</span></code><a class="headerlink" href="#parse" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[parse] help')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[parse] help'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Parse</span> <span class="n">the</span> <span class="n">string</span> <span class="n">on</span> <span class="n">the</span> <span class="n">stack</span> <span class="n">to</span> <span class="n">a</span> <span class="n">Joy</span> <span class="n">expression</span><span class="o">.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 "2 [3] dup" parse')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 "2 [3] dup" parse'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="n">dup</span><span class="p">]</span>
|
||||
@@ -737,7 +737,7 @@ reduces them to their … least common factors or whatever.</p>
|
||||
<section id="run">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">run</span></code><a class="headerlink" href="#run" title="Permalink to this headline">¶</a></h3>
|
||||
<p>Evaluate a quoted Joy sequence.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1 2 dup + +] run')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 2 dup + +] run'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">5</span><span class="p">]</span>
|
||||
@@ -749,7 +749,7 @@ reduces them to their … least common factors or whatever.</p>
|
||||
<h2>Combinators<a class="headerlink" href="#combinators" title="Permalink to this headline">¶</a></h2>
|
||||
<section id="app1-app2-app3">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">app1</span></code> <code class="docutils literal notranslate"><span class="pre">app2</span></code> <code class="docutils literal notranslate"><span class="pre">app3</span></code><a class="headerlink" href="#app1-app2-app3" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[app1] help')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[app1] help'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Given</span> <span class="n">a</span> <span class="n">quoted</span> <span class="n">program</span> <span class="n">on</span> <span class="n">TOS</span> <span class="ow">and</span> <span class="n">anything</span> <span class="k">as</span> <span class="n">the</span> <span class="n">second</span> <span class="n">stack</span> <span class="n">item</span> <span class="n">run</span>
|
||||
@@ -761,19 +761,19 @@ reduces them to their … least common factors or whatever.</p>
|
||||
<span class="o">...</span> <span class="p">[</span><span class="n">x</span> <span class="o">...</span><span class="p">]</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="o">.</span> <span class="n">infra</span> <span class="n">first</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('10 4 [sqr *] app1')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'10 4 [sqr *] app1'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">10</span> <span class="mi">160</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('10 3 4 [sqr *] app2')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'10 3 4 [sqr *] app2'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">10</span> <span class="mi">90</span> <span class="mi">160</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[app2] help')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[app2] help'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Like</span> <span class="n">app1</span> <span class="k">with</span> <span class="n">two</span> <span class="n">items</span><span class="o">.</span>
|
||||
@@ -784,7 +784,7 @@ reduces them to their … least common factors or whatever.</p>
|
||||
<span class="p">[</span><span class="n">x</span> <span class="o">...</span><span class="p">]</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">infra</span> <span class="n">first</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('10 2 3 4 [sqr *] app3')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'10 2 3 4 [sqr *] app3'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">10</span> <span class="mi">40</span> <span class="mi">90</span> <span class="mi">160</span>
|
||||
@@ -804,7 +804,7 @@ function <code class="docutils literal notranslate"><span class="pre">[G]</span>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="nb">range</span> <span class="o">==</span> <span class="p">[</span><span class="mi">0</span> <span class="o"><=</span><span class="p">]</span> <span class="p">[</span><span class="mi">1</span> <span class="o">-</span> <span class="n">dup</span><span class="p">]</span> <span class="n">anamorphism</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('3 [0 <=] [1 - dup] anamorphism')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'3 [0 <=] [1 - dup] anamorphism'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">2</span> <span class="mi">1</span> <span class="mi">0</span><span class="p">]</span>
|
||||
@@ -813,13 +813,13 @@ function <code class="docutils literal notranslate"><span class="pre">[G]</span>
|
||||
</section>
|
||||
<section id="branch">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">branch</span></code><a class="headerlink" href="#branch" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('3 4 1 [+] [*] branch')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'3 4 1 [+] [*] branch'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">12</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('3 4 0 [+] [*] branch')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'3 4 0 [+] [*] branch'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">7</span>
|
||||
@@ -846,7 +846,7 @@ in terms of <code class="docutils literal notranslate"><span class="pre">app2</s
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">cleave</span> <span class="o">==</span> <span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="n">app2</span> <span class="p">[</span><span class="n">popd</span><span class="p">]</span> <span class="n">dip</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('10 2 [+] [-] cleave')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'10 2 [+] [-] cleave'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">10</span> <span class="mi">12</span> <span class="mi">8</span>
|
||||
@@ -855,19 +855,19 @@ in terms of <code class="docutils literal notranslate"><span class="pre">app2</s
|
||||
</section>
|
||||
<section id="dip-dipd-dipdd">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">dip</span></code> <code class="docutils literal notranslate"><span class="pre">dipd</span></code> <code class="docutils literal notranslate"><span class="pre">dipdd</span></code><a class="headerlink" href="#dip-dipd-dipdd" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 2 3 4 5 [+] dip')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 2 3 4 5 [+] dip'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">7</span> <span class="mi">5</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 2 3 4 5 [+] dipd')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 2 3 4 5 [+] dipd'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span> <span class="mi">5</span> <span class="mi">4</span> <span class="mi">5</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 2 3 4 5 [+] dipdd')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 2 3 4 5 [+] dipdd'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">3</span> <span class="mi">3</span> <span class="mi">4</span> <span class="mi">5</span>
|
||||
@@ -881,7 +881,7 @@ in terms of <code class="docutils literal notranslate"><span class="pre">app2</s
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">n</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">dupdip</span> <span class="o">==</span> <span class="n">n</span> <span class="n">Q</span> <span class="n">n</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>V('23 [++] dupdip *') # N(N + 1)
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'23 [++] dupdip *'</span><span class="p">)</span> <span class="c1"># N(N + 1)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="mi">23</span> <span class="p">[</span><span class="o">++</span><span class="p">]</span> <span class="n">dupdip</span> <span class="o">*</span>
|
||||
@@ -896,7 +896,7 @@ in terms of <code class="docutils literal notranslate"><span class="pre">app2</s
|
||||
</section>
|
||||
<section id="genrec-primrec">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">genrec</span></code> <code class="docutils literal notranslate"><span class="pre">primrec</span></code><a class="headerlink" href="#genrec-primrec" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[genrec] help')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[genrec] help'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">General</span> <span class="n">Recursion</span> <span class="n">Combinator</span><span class="o">.</span>
|
||||
@@ -945,7 +945,7 @@ in terms of <code class="docutils literal notranslate"><span class="pre">app2</s
|
||||
<span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('3 [1 <=] [] [dup --] [i *] genrec')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'3 [1 <=] [] [dup --] [i *] genrec'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">6</span>
|
||||
@@ -954,7 +954,7 @@ in terms of <code class="docutils literal notranslate"><span class="pre">app2</s
|
||||
</section>
|
||||
<section id="i">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">i</span></code><a class="headerlink" href="#i" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>V('1 2 3 [+ +] i')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'1 2 3 [+ +] i'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="p">[</span><span class="o">+</span> <span class="o">+</span><span class="p">]</span> <span class="n">i</span>
|
||||
@@ -973,13 +973,13 @@ in terms of <code class="docutils literal notranslate"><span class="pre">app2</s
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">predicate</span><span class="p">]</span> <span class="p">[</span><span class="n">then</span><span class="p">]</span> <span class="p">[</span><span class="k">else</span><span class="p">]</span> <span class="n">ifte</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 2 [1] [+] [*] ifte')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 2 [1] [+] [*] ifte'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">3</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 2 [0] [+] [*] ifte')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 2 [0] [+] [*] ifte'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">2</span>
|
||||
@@ -988,7 +988,7 @@ in terms of <code class="docutils literal notranslate"><span class="pre">app2</s
|
||||
</section>
|
||||
<section id="infra">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">infra</span></code><a class="headerlink" href="#infra" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>V('1 2 3 [4 5 6] [* +] infra')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'1 2 3 [4 5 6] [* +] infra'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">5</span> <span class="mi">6</span><span class="p">]</span> <span class="p">[</span><span class="o">*</span> <span class="o">+</span><span class="p">]</span> <span class="n">infra</span>
|
||||
@@ -1007,7 +1007,7 @@ in terms of <code class="docutils literal notranslate"><span class="pre">app2</s
|
||||
</section>
|
||||
<section id="loop">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">loop</span></code><a class="headerlink" href="#loop" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[loop] help')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[loop] help'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Basic</span> <span class="n">loop</span> <span class="n">combinator</span><span class="o">.</span>
|
||||
@@ -1021,7 +1021,7 @@ in terms of <code class="docutils literal notranslate"><span class="pre">app2</s
|
||||
<span class="o">...</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>V('3 dup [1 - dup] loop')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'3 dup [1 - dup] loop'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="mi">3</span> <span class="n">dup</span> <span class="p">[</span><span class="mi">1</span> <span class="o">-</span> <span class="n">dup</span><span class="p">]</span> <span class="n">loop</span>
|
||||
@@ -1049,13 +1049,13 @@ in terms of <code class="docutils literal notranslate"><span class="pre">app2</s
|
||||
</section>
|
||||
<section id="map-pam">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">map</span></code> <code class="docutils literal notranslate"><span class="pre">pam</span></code><a class="headerlink" href="#map-pam" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('10 [1 2 3] [*] map')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'10 [1 2 3] [*] map'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">10</span> <span class="p">[</span><span class="mi">10</span> <span class="mi">20</span> <span class="mi">30</span><span class="p">]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('10 5 [[*][/][+][-]] pam')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'10 5 [[*][/][+][-]] pam'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">10</span> <span class="mi">5</span> <span class="p">[</span><span class="mi">50</span> <span class="mf">2.0</span> <span class="mi">15</span> <span class="mi">5</span><span class="p">]</span>
|
||||
@@ -1066,25 +1066,25 @@ in terms of <code class="docutils literal notranslate"><span class="pre">app2</s
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">nullary</span></code> <code class="docutils literal notranslate"><span class="pre">unary</span></code> <code class="docutils literal notranslate"><span class="pre">binary</span></code> <code class="docutils literal notranslate"><span class="pre">ternary</span></code><a class="headerlink" href="#nullary-unary-binary-ternary" title="Permalink to this headline">¶</a></h3>
|
||||
<p>Run a quoted program enforcing
|
||||
<a class="reference external" href="https://en.wikipedia.org/wiki/Arity">arity</a>.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 2 3 4 5 [+] nullary')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 2 3 4 5 [+] nullary'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span> <span class="mi">5</span> <span class="mi">9</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 2 3 4 5 [+] unary')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 2 3 4 5 [+] unary'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span> <span class="mi">9</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 2 3 4 5 [+] binary') # + has arity 2 so this is technically pointless...
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 2 3 4 5 [+] binary'</span><span class="p">)</span> <span class="c1"># + has arity 2 so this is technically pointless...</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">9</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('1 2 3 4 5 [+] ternary')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'1 2 3 4 5 [+] ternary'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">9</span>
|
||||
@@ -1093,7 +1093,7 @@ in terms of <code class="docutils literal notranslate"><span class="pre">app2</s
|
||||
</section>
|
||||
<section id="step">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">step</span></code><a class="headerlink" href="#step" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[step] help')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[step] help'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Run</span> <span class="n">a</span> <span class="n">quoted</span> <span class="n">program</span> <span class="n">on</span> <span class="n">each</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">a</span> <span class="n">sequence</span><span class="o">.</span>
|
||||
@@ -1116,7 +1116,7 @@ in terms of <code class="docutils literal notranslate"><span class="pre">app2</s
|
||||
<span class="n">on</span> <span class="n">top</span> <span class="n">of</span> <span class="n">the</span> <span class="n">stack</span><span class="o">.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>V('0 [1 2 3] [+] step')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'0 [1 2 3] [+] step'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="o">+</span><span class="p">]</span> <span class="n">step</span>
|
||||
@@ -1141,7 +1141,7 @@ in terms of <code class="docutils literal notranslate"><span class="pre">app2</s
|
||||
</section>
|
||||
<section id="times">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">times</span></code><a class="headerlink" href="#times" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>V('3 2 1 2 [+] times')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'3 2 1 2 [+] times'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="mi">3</span> <span class="mi">2</span> <span class="mi">1</span> <span class="mi">2</span> <span class="p">[</span><span class="o">+</span><span class="p">]</span> <span class="n">times</span>
|
||||
@@ -1161,7 +1161,7 @@ in terms of <code class="docutils literal notranslate"><span class="pre">app2</s
|
||||
</section>
|
||||
<section id="b">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">b</span></code><a class="headerlink" href="#b" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[b] help')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[b] help'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">b</span> <span class="o">==</span> <span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="n">dip</span> <span class="n">i</span>
|
||||
@@ -1170,7 +1170,7 @@ in terms of <code class="docutils literal notranslate"><span class="pre">app2</s
|
||||
<span class="o">...</span> <span class="p">[</span><span class="n">P</span><span class="p">]</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">b</span> <span class="o">==</span> <span class="o">...</span> <span class="n">P</span> <span class="n">Q</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>V('1 2 [3] [4] b')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'1 2 [3] [4] b'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="mi">1</span> <span class="mi">2</span> <span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="n">b</span>
|
||||
@@ -1189,7 +1189,7 @@ in terms of <code class="docutils literal notranslate"><span class="pre">app2</s
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">predicate</span><span class="p">]</span> <span class="p">[</span><span class="n">body</span><span class="p">]</span> <span class="k">while</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('3 [0 >] [dup --] while')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'3 [0 >] [dup --] while'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">3</span> <span class="mi">2</span> <span class="mi">1</span> <span class="mi">0</span>
|
||||
@@ -1198,7 +1198,7 @@ in terms of <code class="docutils literal notranslate"><span class="pre">app2</s
|
||||
</section>
|
||||
<section id="x">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">x</span></code><a class="headerlink" href="#x" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[x] help')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[x] help'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">x</span> <span class="o">==</span> <span class="n">dup</span> <span class="n">i</span>
|
||||
@@ -1208,7 +1208,7 @@ in terms of <code class="docutils literal notranslate"><span class="pre">app2</s
|
||||
<span class="o">...</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">x</span> <span class="o">=</span> <span class="o">...</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">Q</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>V('1 [2] [i 3] x') # Kind of a pointless example.
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'1 [2] [i 3] x'</span><span class="p">)</span> <span class="c1"># Kind of a pointless example.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="mi">1</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="n">i</span> <span class="mi">3</span><span class="p">]</span> <span class="n">x</span>
|
||||
@@ -1231,25 +1231,25 @@ in terms of <code class="docutils literal notranslate"><span class="pre">app2</s
|
||||
*arithmetic*</a>
|
||||
over quote-only datastructures (that is, datastructures that consist
|
||||
soley of containers, without strings or numbers or anything else.)</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[] void')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[] void'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kc">False</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[[]] void')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[[]] void'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kc">True</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[[][[]]] void')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[[][[]]] void'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kc">True</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[[[]][[][]]] void')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[[[]][[][]]] void'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kc">False</span>
|
||||
|
||||
@@ -96,15 +96,15 @@ R∘λ = λ∘R = R
|
||||
</section>
|
||||
<section id="implementation">
|
||||
<h2>Implementation<a class="headerlink" href="#implementation" title="Permalink to this headline">¶</a></h2>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>from functools import partial as curry
|
||||
from itertools import product
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">functools</span> <span class="kn">import</span> <span class="n">partial</span> <span class="k">as</span> <span class="n">curry</span>
|
||||
<span class="kn">from</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="n">product</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<section id="and">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">ϕ</span></code> and <code class="docutils literal notranslate"><span class="pre">λ</span></code><a class="headerlink" href="#and" title="Permalink to this headline">¶</a></h3>
|
||||
<p>The empty set and the set of just the empty string.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>phi = frozenset() # ϕ
|
||||
y = frozenset({''}) # λ
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">phi</span> <span class="o">=</span> <span class="nb">frozenset</span><span class="p">()</span> <span class="c1"># ϕ</span>
|
||||
<span class="n">y</span> <span class="o">=</span> <span class="nb">frozenset</span><span class="p">({</span><span class="s1">''</span><span class="p">})</span> <span class="c1"># λ</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -115,7 +115,7 @@ illustrate the algorithm and because you can represent any other
|
||||
alphabet with two symbols (if you had to.)</p>
|
||||
<p>I chose the names <code class="docutils literal notranslate"><span class="pre">O</span></code> and <code class="docutils literal notranslate"><span class="pre">l</span></code> (uppercase “o” and lowercase “L”) to
|
||||
look like <code class="docutils literal notranslate"><span class="pre">0</span></code> and <code class="docutils literal notranslate"><span class="pre">1</span></code> (zero and one) respectively.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>syms = O, l = frozenset({'0'}), frozenset({'1'})
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">syms</span> <span class="o">=</span> <span class="n">O</span><span class="p">,</span> <span class="n">l</span> <span class="o">=</span> <span class="nb">frozenset</span><span class="p">({</span><span class="s1">'0'</span><span class="p">}),</span> <span class="nb">frozenset</span><span class="p">({</span><span class="s1">'1'</span><span class="p">})</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -133,7 +133,7 @@ expression</em> is one of:</p>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Where <code class="docutils literal notranslate"><span class="pre">R</span></code> and <code class="docutils literal notranslate"><span class="pre">S</span></code> stand for <em>regular expressions</em>.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>AND, CONS, KSTAR, NOT, OR = 'and cons * not or'.split() # Tags are just strings.
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">AND</span><span class="p">,</span> <span class="n">CONS</span><span class="p">,</span> <span class="n">KSTAR</span><span class="p">,</span> <span class="n">NOT</span><span class="p">,</span> <span class="n">OR</span> <span class="o">=</span> <span class="s1">'and cons * not or'</span><span class="o">.</span><span class="n">split</span><span class="p">()</span> <span class="c1"># Tags are just strings.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Because they are formed of <code class="docutils literal notranslate"><span class="pre">frozenset</span></code>, <code class="docutils literal notranslate"><span class="pre">tuple</span></code> and <code class="docutils literal notranslate"><span class="pre">str</span></code> objects
|
||||
@@ -141,36 +141,36 @@ only, these datastructures are immutable.</p>
|
||||
</section>
|
||||
<section id="string-representation-of-re-datastructures">
|
||||
<h3>String Representation of RE Datastructures<a class="headerlink" href="#string-representation-of-re-datastructures" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>def stringy(re):
|
||||
'''
|
||||
Return a nice string repr for a regular expression datastructure.
|
||||
'''
|
||||
if re == I: return '.'
|
||||
if re in syms: return next(iter(re))
|
||||
if re == y: return '^'
|
||||
if re == phi: return 'X'
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">stringy</span><span class="p">(</span><span class="n">re</span><span class="p">):</span>
|
||||
<span class="sd">'''</span>
|
||||
<span class="sd"> Return a nice string repr for a regular expression datastructure.</span>
|
||||
<span class="sd"> '''</span>
|
||||
<span class="k">if</span> <span class="n">re</span> <span class="o">==</span> <span class="n">I</span><span class="p">:</span> <span class="k">return</span> <span class="s1">'.'</span>
|
||||
<span class="k">if</span> <span class="n">re</span> <span class="ow">in</span> <span class="n">syms</span><span class="p">:</span> <span class="k">return</span> <span class="nb">next</span><span class="p">(</span><span class="nb">iter</span><span class="p">(</span><span class="n">re</span><span class="p">))</span>
|
||||
<span class="k">if</span> <span class="n">re</span> <span class="o">==</span> <span class="n">y</span><span class="p">:</span> <span class="k">return</span> <span class="s1">'^'</span>
|
||||
<span class="k">if</span> <span class="n">re</span> <span class="o">==</span> <span class="n">phi</span><span class="p">:</span> <span class="k">return</span> <span class="s1">'X'</span>
|
||||
|
||||
assert isinstance(re, tuple), repr(re)
|
||||
tag = re[0]
|
||||
<span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">re</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">),</span> <span class="nb">repr</span><span class="p">(</span><span class="n">re</span><span class="p">)</span>
|
||||
<span class="n">tag</span> <span class="o">=</span> <span class="n">re</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
||||
|
||||
if tag == KSTAR:
|
||||
body = stringy(re[1])
|
||||
if not body: return body
|
||||
if len(body) > 1: return '(' + body + ")*"
|
||||
return body + '*'
|
||||
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="n">KSTAR</span><span class="p">:</span>
|
||||
<span class="n">body</span> <span class="o">=</span> <span class="n">stringy</span><span class="p">(</span><span class="n">re</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
||||
<span class="k">if</span> <span class="ow">not</span> <span class="n">body</span><span class="p">:</span> <span class="k">return</span> <span class="n">body</span>
|
||||
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">body</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span> <span class="k">return</span> <span class="s1">'('</span> <span class="o">+</span> <span class="n">body</span> <span class="o">+</span> <span class="s2">")*"</span>
|
||||
<span class="k">return</span> <span class="n">body</span> <span class="o">+</span> <span class="s1">'*'</span>
|
||||
|
||||
if tag == NOT:
|
||||
body = stringy(re[1])
|
||||
if not body: return body
|
||||
if len(body) > 1: return '(' + body + ")'"
|
||||
return body + "'"
|
||||
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="n">NOT</span><span class="p">:</span>
|
||||
<span class="n">body</span> <span class="o">=</span> <span class="n">stringy</span><span class="p">(</span><span class="n">re</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
||||
<span class="k">if</span> <span class="ow">not</span> <span class="n">body</span><span class="p">:</span> <span class="k">return</span> <span class="n">body</span>
|
||||
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">body</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span> <span class="k">return</span> <span class="s1">'('</span> <span class="o">+</span> <span class="n">body</span> <span class="o">+</span> <span class="s2">")'"</span>
|
||||
<span class="k">return</span> <span class="n">body</span> <span class="o">+</span> <span class="s2">"'"</span>
|
||||
|
||||
r, s = stringy(re[1]), stringy(re[2])
|
||||
if tag == CONS: return r + s
|
||||
if tag == OR: return '%s | %s' % (r, s)
|
||||
if tag == AND: return '(%s) & (%s)' % (r, s)
|
||||
<span class="n">r</span><span class="p">,</span> <span class="n">s</span> <span class="o">=</span> <span class="n">stringy</span><span class="p">(</span><span class="n">re</span><span class="p">[</span><span class="mi">1</span><span class="p">]),</span> <span class="n">stringy</span><span class="p">(</span><span class="n">re</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
|
||||
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="n">CONS</span><span class="p">:</span> <span class="k">return</span> <span class="n">r</span> <span class="o">+</span> <span class="n">s</span>
|
||||
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="n">OR</span><span class="p">:</span> <span class="k">return</span> <span class="s1">'</span><span class="si">%s</span><span class="s1"> | </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span>
|
||||
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="n">AND</span><span class="p">:</span> <span class="k">return</span> <span class="s1">'(</span><span class="si">%s</span><span class="s1">) & (</span><span class="si">%s</span><span class="s1">)'</span> <span class="o">%</span> <span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span>
|
||||
|
||||
raise ValueError
|
||||
<span class="k">raise</span> <span class="ne">ValueError</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -180,10 +180,10 @@ only, these datastructures are immutable.</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">I</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="o">|</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>I = (KSTAR, (OR, O, l))
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">I</span> <span class="o">=</span> <span class="p">(</span><span class="n">KSTAR</span><span class="p">,</span> <span class="p">(</span><span class="n">OR</span><span class="p">,</span> <span class="n">O</span><span class="p">,</span> <span class="n">l</span><span class="p">))</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>print stringy(I)
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">stringy</span><span class="p">(</span><span class="n">I</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">.</span>
|
||||
@@ -198,13 +198,13 @@ only, these datastructures are immutable.</p>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Note that it contains one of everything.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>a = (CONS, I, (CONS, l, (CONS, l, (CONS, l, I))))
|
||||
b = (CONS, I, (CONS, O, l))
|
||||
c = (CONS, l, (KSTAR, l))
|
||||
it = (AND, a, (NOT, (OR, b, c)))
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">a</span> <span class="o">=</span> <span class="p">(</span><span class="n">CONS</span><span class="p">,</span> <span class="n">I</span><span class="p">,</span> <span class="p">(</span><span class="n">CONS</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="p">(</span><span class="n">CONS</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="p">(</span><span class="n">CONS</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="n">I</span><span class="p">))))</span>
|
||||
<span class="n">b</span> <span class="o">=</span> <span class="p">(</span><span class="n">CONS</span><span class="p">,</span> <span class="n">I</span><span class="p">,</span> <span class="p">(</span><span class="n">CONS</span><span class="p">,</span> <span class="n">O</span><span class="p">,</span> <span class="n">l</span><span class="p">))</span>
|
||||
<span class="n">c</span> <span class="o">=</span> <span class="p">(</span><span class="n">CONS</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="p">(</span><span class="n">KSTAR</span><span class="p">,</span> <span class="n">l</span><span class="p">))</span>
|
||||
<span class="n">it</span> <span class="o">=</span> <span class="p">(</span><span class="n">AND</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">NOT</span><span class="p">,</span> <span class="p">(</span><span class="n">OR</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">)))</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>print stringy(it)
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">stringy</span><span class="p">(</span><span class="n">it</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="o">.</span><span class="mf">111.</span><span class="p">)</span> <span class="o">&</span> <span class="p">((</span><span class="o">.</span><span class="mi">01</span> <span class="o">|</span> <span class="mi">11</span><span class="o">*</span><span class="p">)</span><span class="s1">')</span>
|
||||
@@ -214,36 +214,36 @@ it = (AND, a, (NOT, (OR, b, c)))
|
||||
<section id="nully">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">nully()</span></code><a class="headerlink" href="#nully" title="Permalink to this headline">¶</a></h3>
|
||||
<p>Let’s get that auxiliary predicate function <code class="docutils literal notranslate"><span class="pre">δ</span></code> out of the way.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>def nully(R):
|
||||
'''
|
||||
δ - Return λ if λ ⊆ R otherwise ϕ.
|
||||
'''
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">nully</span><span class="p">(</span><span class="n">R</span><span class="p">):</span>
|
||||
<span class="sd">'''</span>
|
||||
<span class="sd"> δ - Return λ if λ ⊆ R otherwise ϕ.</span>
|
||||
<span class="sd"> '''</span>
|
||||
|
||||
# δ(a) → ϕ
|
||||
# δ(ϕ) → ϕ
|
||||
if R in syms or R == phi:
|
||||
return phi
|
||||
<span class="c1"># δ(a) → ϕ</span>
|
||||
<span class="c1"># δ(ϕ) → ϕ</span>
|
||||
<span class="k">if</span> <span class="n">R</span> <span class="ow">in</span> <span class="n">syms</span> <span class="ow">or</span> <span class="n">R</span> <span class="o">==</span> <span class="n">phi</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="n">phi</span>
|
||||
|
||||
# δ(λ) → λ
|
||||
if R == y:
|
||||
return y
|
||||
<span class="c1"># δ(λ) → λ</span>
|
||||
<span class="k">if</span> <span class="n">R</span> <span class="o">==</span> <span class="n">y</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="n">y</span>
|
||||
|
||||
tag = R[0]
|
||||
<span class="n">tag</span> <span class="o">=</span> <span class="n">R</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
||||
|
||||
# δ(R*) → λ
|
||||
if tag == KSTAR:
|
||||
return y
|
||||
<span class="c1"># δ(R*) → λ</span>
|
||||
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="n">KSTAR</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="n">y</span>
|
||||
|
||||
# δ(¬R) δ(R)≟ϕ → λ
|
||||
# δ(¬R) δ(R)≟λ → ϕ
|
||||
if tag == NOT:
|
||||
return phi if nully(R[1]) else y
|
||||
<span class="c1"># δ(¬R) δ(R)≟ϕ → λ</span>
|
||||
<span class="c1"># δ(¬R) δ(R)≟λ → ϕ</span>
|
||||
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="n">NOT</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="n">phi</span> <span class="k">if</span> <span class="n">nully</span><span class="p">(</span><span class="n">R</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="k">else</span> <span class="n">y</span>
|
||||
|
||||
# δ(R∘S) → δ(R) ∧ δ(S)
|
||||
# δ(R ∧ S) → δ(R) ∧ δ(S)
|
||||
# δ(R ∨ S) → δ(R) ∨ δ(S)
|
||||
r, s = nully(R[1]), nully(R[2])
|
||||
return r & s if tag in {AND, CONS} else r | s
|
||||
<span class="c1"># δ(R∘S) → δ(R) ∧ δ(S)</span>
|
||||
<span class="c1"># δ(R ∧ S) → δ(R) ∧ δ(S)</span>
|
||||
<span class="c1"># δ(R ∨ S) → δ(R) ∨ δ(S)</span>
|
||||
<span class="n">r</span><span class="p">,</span> <span class="n">s</span> <span class="o">=</span> <span class="n">nully</span><span class="p">(</span><span class="n">R</span><span class="p">[</span><span class="mi">1</span><span class="p">]),</span> <span class="n">nully</span><span class="p">(</span><span class="n">R</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
|
||||
<span class="k">return</span> <span class="n">r</span> <span class="o">&</span> <span class="n">s</span> <span class="k">if</span> <span class="n">tag</span> <span class="ow">in</span> <span class="p">{</span><span class="n">AND</span><span class="p">,</span> <span class="n">CONS</span><span class="p">}</span> <span class="k">else</span> <span class="n">r</span> <span class="o">|</span> <span class="n">s</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -252,71 +252,71 @@ it = (AND, a, (NOT, (OR, b, c)))
|
||||
<p>This is the straightforward version with no “compaction”. It works fine,
|
||||
but does waaaay too much work because the expressions grow each
|
||||
derivation.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>def D(symbol):
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">D</span><span class="p">(</span><span class="n">symbol</span><span class="p">):</span>
|
||||
|
||||
def derv(R):
|
||||
<span class="k">def</span> <span class="nf">derv</span><span class="p">(</span><span class="n">R</span><span class="p">):</span>
|
||||
|
||||
# ∂a(a) → λ
|
||||
if R == {symbol}:
|
||||
return y
|
||||
<span class="c1"># ∂a(a) → λ</span>
|
||||
<span class="k">if</span> <span class="n">R</span> <span class="o">==</span> <span class="p">{</span><span class="n">symbol</span><span class="p">}:</span>
|
||||
<span class="k">return</span> <span class="n">y</span>
|
||||
|
||||
# ∂a(λ) → ϕ
|
||||
# ∂a(ϕ) → ϕ
|
||||
# ∂a(¬a) → ϕ
|
||||
if R == y or R == phi or R in syms:
|
||||
return phi
|
||||
<span class="c1"># ∂a(λ) → ϕ</span>
|
||||
<span class="c1"># ∂a(ϕ) → ϕ</span>
|
||||
<span class="c1"># ∂a(¬a) → ϕ</span>
|
||||
<span class="k">if</span> <span class="n">R</span> <span class="o">==</span> <span class="n">y</span> <span class="ow">or</span> <span class="n">R</span> <span class="o">==</span> <span class="n">phi</span> <span class="ow">or</span> <span class="n">R</span> <span class="ow">in</span> <span class="n">syms</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="n">phi</span>
|
||||
|
||||
tag = R[0]
|
||||
<span class="n">tag</span> <span class="o">=</span> <span class="n">R</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
||||
|
||||
# ∂a(R*) → ∂a(R)∘R*
|
||||
if tag == KSTAR:
|
||||
return (CONS, derv(R[1]), R)
|
||||
<span class="c1"># ∂a(R*) → ∂a(R)∘R*</span>
|
||||
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="n">KSTAR</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="p">(</span><span class="n">CONS</span><span class="p">,</span> <span class="n">derv</span><span class="p">(</span><span class="n">R</span><span class="p">[</span><span class="mi">1</span><span class="p">]),</span> <span class="n">R</span><span class="p">)</span>
|
||||
|
||||
# ∂a(¬R) → ¬∂a(R)
|
||||
if tag == NOT:
|
||||
return (NOT, derv(R[1]))
|
||||
<span class="c1"># ∂a(¬R) → ¬∂a(R)</span>
|
||||
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="n">NOT</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="p">(</span><span class="n">NOT</span><span class="p">,</span> <span class="n">derv</span><span class="p">(</span><span class="n">R</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
|
||||
|
||||
r, s = R[1:]
|
||||
<span class="n">r</span><span class="p">,</span> <span class="n">s</span> <span class="o">=</span> <span class="n">R</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
|
||||
|
||||
# ∂a(R∘S) → ∂a(R)∘S ∨ δ(R)∘∂a(S)
|
||||
if tag == CONS:
|
||||
A = (CONS, derv(r), s) # A = ∂a(R)∘S
|
||||
# A ∨ δ(R) ∘ ∂a(S)
|
||||
# A ∨ λ ∘ ∂a(S) → A ∨ ∂a(S)
|
||||
# A ∨ ϕ ∘ ∂a(S) → A ∨ ϕ → A
|
||||
return (OR, A, derv(s)) if nully(r) else A
|
||||
<span class="c1"># ∂a(R∘S) → ∂a(R)∘S ∨ δ(R)∘∂a(S)</span>
|
||||
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="n">CONS</span><span class="p">:</span>
|
||||
<span class="n">A</span> <span class="o">=</span> <span class="p">(</span><span class="n">CONS</span><span class="p">,</span> <span class="n">derv</span><span class="p">(</span><span class="n">r</span><span class="p">),</span> <span class="n">s</span><span class="p">)</span> <span class="c1"># A = ∂a(R)∘S</span>
|
||||
<span class="c1"># A ∨ δ(R) ∘ ∂a(S)</span>
|
||||
<span class="c1"># A ∨ λ ∘ ∂a(S) → A ∨ ∂a(S)</span>
|
||||
<span class="c1"># A ∨ ϕ ∘ ∂a(S) → A ∨ ϕ → A</span>
|
||||
<span class="k">return</span> <span class="p">(</span><span class="n">OR</span><span class="p">,</span> <span class="n">A</span><span class="p">,</span> <span class="n">derv</span><span class="p">(</span><span class="n">s</span><span class="p">))</span> <span class="k">if</span> <span class="n">nully</span><span class="p">(</span><span class="n">r</span><span class="p">)</span> <span class="k">else</span> <span class="n">A</span>
|
||||
|
||||
# ∂a(R ∧ S) → ∂a(R) ∧ ∂a(S)
|
||||
# ∂a(R ∨ S) → ∂a(R) ∨ ∂a(S)
|
||||
return (tag, derv(r), derv(s))
|
||||
<span class="c1"># ∂a(R ∧ S) → ∂a(R) ∧ ∂a(S)</span>
|
||||
<span class="c1"># ∂a(R ∨ S) → ∂a(R) ∨ ∂a(S)</span>
|
||||
<span class="k">return</span> <span class="p">(</span><span class="n">tag</span><span class="p">,</span> <span class="n">derv</span><span class="p">(</span><span class="n">r</span><span class="p">),</span> <span class="n">derv</span><span class="p">(</span><span class="n">s</span><span class="p">))</span>
|
||||
|
||||
return derv
|
||||
<span class="k">return</span> <span class="n">derv</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</section>
|
||||
<section id="compaction-rules">
|
||||
<h3>Compaction Rules<a class="headerlink" href="#compaction-rules" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>def _compaction_rule(relation, one, zero, a, b):
|
||||
return (
|
||||
b if a == one else # R*1 = 1*R = R
|
||||
a if b == one else
|
||||
zero if a == zero or b == zero else # R*0 = 0*R = 0
|
||||
(relation, a, b)
|
||||
)
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">_compaction_rule</span><span class="p">(</span><span class="n">relation</span><span class="p">,</span> <span class="n">one</span><span class="p">,</span> <span class="n">zero</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
|
||||
<span class="k">return</span> <span class="p">(</span>
|
||||
<span class="n">b</span> <span class="k">if</span> <span class="n">a</span> <span class="o">==</span> <span class="n">one</span> <span class="k">else</span> <span class="c1"># R*1 = 1*R = R</span>
|
||||
<span class="n">a</span> <span class="k">if</span> <span class="n">b</span> <span class="o">==</span> <span class="n">one</span> <span class="k">else</span>
|
||||
<span class="n">zero</span> <span class="k">if</span> <span class="n">a</span> <span class="o">==</span> <span class="n">zero</span> <span class="ow">or</span> <span class="n">b</span> <span class="o">==</span> <span class="n">zero</span> <span class="k">else</span> <span class="c1"># R*0 = 0*R = 0</span>
|
||||
<span class="p">(</span><span class="n">relation</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
|
||||
<span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>An elegant symmetry.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span># R ∧ I = I ∧ R = R
|
||||
# R ∧ ϕ = ϕ ∧ R = ϕ
|
||||
_and = curry(_compaction_rule, AND, I, phi)
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># R ∧ I = I ∧ R = R</span>
|
||||
<span class="c1"># R ∧ ϕ = ϕ ∧ R = ϕ</span>
|
||||
<span class="n">_and</span> <span class="o">=</span> <span class="n">curry</span><span class="p">(</span><span class="n">_compaction_rule</span><span class="p">,</span> <span class="n">AND</span><span class="p">,</span> <span class="n">I</span><span class="p">,</span> <span class="n">phi</span><span class="p">)</span>
|
||||
|
||||
# R ∨ ϕ = ϕ ∨ R = R
|
||||
# R ∨ I = I ∨ R = I
|
||||
_or = curry(_compaction_rule, OR, phi, I)
|
||||
<span class="c1"># R ∨ ϕ = ϕ ∨ R = R</span>
|
||||
<span class="c1"># R ∨ I = I ∨ R = I</span>
|
||||
<span class="n">_or</span> <span class="o">=</span> <span class="n">curry</span><span class="p">(</span><span class="n">_compaction_rule</span><span class="p">,</span> <span class="n">OR</span><span class="p">,</span> <span class="n">phi</span><span class="p">,</span> <span class="n">I</span><span class="p">)</span>
|
||||
|
||||
# R∘λ = λ∘R = R
|
||||
# R∘ϕ = ϕ∘R = ϕ
|
||||
_cons = curry(_compaction_rule, CONS, y, phi)
|
||||
<span class="c1"># R∘λ = λ∘R = R</span>
|
||||
<span class="c1"># R∘ϕ = ϕ∘R = ϕ</span>
|
||||
<span class="n">_cons</span> <span class="o">=</span> <span class="n">curry</span><span class="p">(</span><span class="n">_compaction_rule</span><span class="p">,</span> <span class="n">CONS</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">phi</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -325,21 +325,21 @@ _cons = curry(_compaction_rule, CONS, y, phi)
|
||||
<p>We can save re-processing by remembering results we have already
|
||||
computed. RE datastructures are immutable and the <code class="docutils literal notranslate"><span class="pre">derv()</span></code> functions
|
||||
are <em>pure</em> so this is fine.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>class Memo(object):
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Memo</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
||||
|
||||
def __init__(self, f):
|
||||
self.f = f
|
||||
self.calls = self.hits = 0
|
||||
self.mem = {}
|
||||
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">):</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">f</span> <span class="o">=</span> <span class="n">f</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">calls</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">hits</span> <span class="o">=</span> <span class="mi">0</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">mem</span> <span class="o">=</span> <span class="p">{}</span>
|
||||
|
||||
def __call__(self, key):
|
||||
self.calls += 1
|
||||
try:
|
||||
result = self.mem[key]
|
||||
self.hits += 1
|
||||
except KeyError:
|
||||
result = self.mem[key] = self.f(key)
|
||||
return result
|
||||
<span class="k">def</span> <span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">calls</span> <span class="o">+=</span> <span class="mi">1</span>
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">mem</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
|
||||
<span class="bp">self</span><span class="o">.</span><span class="n">hits</span> <span class="o">+=</span> <span class="mi">1</span>
|
||||
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
|
||||
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">mem</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
|
||||
<span class="k">return</span> <span class="n">result</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -347,47 +347,47 @@ are <em>pure</em> so this is fine.</p>
|
||||
<h3>With “Compaction”<a class="headerlink" href="#with-compaction" title="Permalink to this headline">¶</a></h3>
|
||||
<p>This version uses the rules above to perform compaction. It keeps the
|
||||
expressions from growing too large.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>def D_compaction(symbol):
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">D_compaction</span><span class="p">(</span><span class="n">symbol</span><span class="p">):</span>
|
||||
|
||||
@Memo
|
||||
def derv(R):
|
||||
<span class="nd">@Memo</span>
|
||||
<span class="k">def</span> <span class="nf">derv</span><span class="p">(</span><span class="n">R</span><span class="p">):</span>
|
||||
|
||||
# ∂a(a) → λ
|
||||
if R == {symbol}:
|
||||
return y
|
||||
<span class="c1"># ∂a(a) → λ</span>
|
||||
<span class="k">if</span> <span class="n">R</span> <span class="o">==</span> <span class="p">{</span><span class="n">symbol</span><span class="p">}:</span>
|
||||
<span class="k">return</span> <span class="n">y</span>
|
||||
|
||||
# ∂a(λ) → ϕ
|
||||
# ∂a(ϕ) → ϕ
|
||||
# ∂a(¬a) → ϕ
|
||||
if R == y or R == phi or R in syms:
|
||||
return phi
|
||||
<span class="c1"># ∂a(λ) → ϕ</span>
|
||||
<span class="c1"># ∂a(ϕ) → ϕ</span>
|
||||
<span class="c1"># ∂a(¬a) → ϕ</span>
|
||||
<span class="k">if</span> <span class="n">R</span> <span class="o">==</span> <span class="n">y</span> <span class="ow">or</span> <span class="n">R</span> <span class="o">==</span> <span class="n">phi</span> <span class="ow">or</span> <span class="n">R</span> <span class="ow">in</span> <span class="n">syms</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="n">phi</span>
|
||||
|
||||
tag = R[0]
|
||||
<span class="n">tag</span> <span class="o">=</span> <span class="n">R</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
||||
|
||||
# ∂a(R*) → ∂a(R)∘R*
|
||||
if tag == KSTAR:
|
||||
return _cons(derv(R[1]), R)
|
||||
<span class="c1"># ∂a(R*) → ∂a(R)∘R*</span>
|
||||
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="n">KSTAR</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="n">_cons</span><span class="p">(</span><span class="n">derv</span><span class="p">(</span><span class="n">R</span><span class="p">[</span><span class="mi">1</span><span class="p">]),</span> <span class="n">R</span><span class="p">)</span>
|
||||
|
||||
# ∂a(¬R) → ¬∂a(R)
|
||||
if tag == NOT:
|
||||
return (NOT, derv(R[1]))
|
||||
<span class="c1"># ∂a(¬R) → ¬∂a(R)</span>
|
||||
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="n">NOT</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="p">(</span><span class="n">NOT</span><span class="p">,</span> <span class="n">derv</span><span class="p">(</span><span class="n">R</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
|
||||
|
||||
r, s = R[1:]
|
||||
<span class="n">r</span><span class="p">,</span> <span class="n">s</span> <span class="o">=</span> <span class="n">R</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
|
||||
|
||||
# ∂a(R∘S) → ∂a(R)∘S ∨ δ(R)∘∂a(S)
|
||||
if tag == CONS:
|
||||
A = _cons(derv(r), s) # A = ∂a(r)∘s
|
||||
# A ∨ δ(R) ∘ ∂a(S)
|
||||
# A ∨ λ ∘ ∂a(S) → A ∨ ∂a(S)
|
||||
# A ∨ ϕ ∘ ∂a(S) → A ∨ ϕ → A
|
||||
return _or(A, derv(s)) if nully(r) else A
|
||||
<span class="c1"># ∂a(R∘S) → ∂a(R)∘S ∨ δ(R)∘∂a(S)</span>
|
||||
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="n">CONS</span><span class="p">:</span>
|
||||
<span class="n">A</span> <span class="o">=</span> <span class="n">_cons</span><span class="p">(</span><span class="n">derv</span><span class="p">(</span><span class="n">r</span><span class="p">),</span> <span class="n">s</span><span class="p">)</span> <span class="c1"># A = ∂a(r)∘s</span>
|
||||
<span class="c1"># A ∨ δ(R) ∘ ∂a(S)</span>
|
||||
<span class="c1"># A ∨ λ ∘ ∂a(S) → A ∨ ∂a(S)</span>
|
||||
<span class="c1"># A ∨ ϕ ∘ ∂a(S) → A ∨ ϕ → A</span>
|
||||
<span class="k">return</span> <span class="n">_or</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">derv</span><span class="p">(</span><span class="n">s</span><span class="p">))</span> <span class="k">if</span> <span class="n">nully</span><span class="p">(</span><span class="n">r</span><span class="p">)</span> <span class="k">else</span> <span class="n">A</span>
|
||||
|
||||
# ∂a(R ∧ S) → ∂a(R) ∧ ∂a(S)
|
||||
# ∂a(R ∨ S) → ∂a(R) ∨ ∂a(S)
|
||||
dr, ds = derv(r), derv(s)
|
||||
return _and(dr, ds) if tag == AND else _or(dr, ds)
|
||||
<span class="c1"># ∂a(R ∧ S) → ∂a(R) ∧ ∂a(S)</span>
|
||||
<span class="c1"># ∂a(R ∨ S) → ∂a(R) ∨ ∂a(S)</span>
|
||||
<span class="n">dr</span><span class="p">,</span> <span class="n">ds</span> <span class="o">=</span> <span class="n">derv</span><span class="p">(</span><span class="n">r</span><span class="p">),</span> <span class="n">derv</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
|
||||
<span class="k">return</span> <span class="n">_and</span><span class="p">(</span><span class="n">dr</span><span class="p">,</span> <span class="n">ds</span><span class="p">)</span> <span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="n">AND</span> <span class="k">else</span> <span class="n">_or</span><span class="p">(</span><span class="n">dr</span><span class="p">,</span> <span class="n">ds</span><span class="p">)</span>
|
||||
|
||||
return derv
|
||||
<span class="k">return</span> <span class="n">derv</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -395,26 +395,26 @@ expressions from growing too large.</p>
|
||||
<section id="lets-try-it-out">
|
||||
<h2>Let’s try it out…<a class="headerlink" href="#lets-try-it-out" title="Permalink to this headline">¶</a></h2>
|
||||
<p>(FIXME: redo.)</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>o, z = D_compaction('0'), D_compaction('1')
|
||||
REs = set()
|
||||
N = 5
|
||||
names = list(product(*(N * [(0, 1)])))
|
||||
dervs = list(product(*(N * [(o, z)])))
|
||||
for name, ds in zip(names, dervs):
|
||||
R = it
|
||||
ds = list(ds)
|
||||
while ds:
|
||||
R = ds.pop()(R)
|
||||
if R == phi or R == I:
|
||||
break
|
||||
REs.add(R)
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">o</span><span class="p">,</span> <span class="n">z</span> <span class="o">=</span> <span class="n">D_compaction</span><span class="p">(</span><span class="s1">'0'</span><span class="p">),</span> <span class="n">D_compaction</span><span class="p">(</span><span class="s1">'1'</span><span class="p">)</span>
|
||||
<span class="n">REs</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
|
||||
<span class="n">N</span> <span class="o">=</span> <span class="mi">5</span>
|
||||
<span class="n">names</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">product</span><span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">N</span> <span class="o">*</span> <span class="p">[(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">)])))</span>
|
||||
<span class="n">dervs</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">product</span><span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">N</span> <span class="o">*</span> <span class="p">[(</span><span class="n">o</span><span class="p">,</span> <span class="n">z</span><span class="p">)])))</span>
|
||||
<span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">ds</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">names</span><span class="p">,</span> <span class="n">dervs</span><span class="p">):</span>
|
||||
<span class="n">R</span> <span class="o">=</span> <span class="n">it</span>
|
||||
<span class="n">ds</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">ds</span><span class="p">)</span>
|
||||
<span class="k">while</span> <span class="n">ds</span><span class="p">:</span>
|
||||
<span class="n">R</span> <span class="o">=</span> <span class="n">ds</span><span class="o">.</span><span class="n">pop</span><span class="p">()(</span><span class="n">R</span><span class="p">)</span>
|
||||
<span class="k">if</span> <span class="n">R</span> <span class="o">==</span> <span class="n">phi</span> <span class="ow">or</span> <span class="n">R</span> <span class="o">==</span> <span class="n">I</span><span class="p">:</span>
|
||||
<span class="k">break</span>
|
||||
<span class="n">REs</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">R</span><span class="p">)</span>
|
||||
|
||||
print stringy(it) ; print
|
||||
print o.hits, '/', o.calls
|
||||
print z.hits, '/', z.calls
|
||||
print
|
||||
for s in sorted(map(stringy, REs), key=lambda n: (len(n), n)):
|
||||
print s
|
||||
<span class="nb">print</span> <span class="n">stringy</span><span class="p">(</span><span class="n">it</span><span class="p">)</span> <span class="p">;</span> <span class="nb">print</span>
|
||||
<span class="nb">print</span> <span class="n">o</span><span class="o">.</span><span class="n">hits</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="n">o</span><span class="o">.</span><span class="n">calls</span>
|
||||
<span class="nb">print</span> <span class="n">z</span><span class="o">.</span><span class="n">hits</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="n">z</span><span class="o">.</span><span class="n">calls</span>
|
||||
<span class="nb">print</span>
|
||||
<span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">stringy</span><span class="p">,</span> <span class="n">REs</span><span class="p">),</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">n</span><span class="p">:</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">n</span><span class="p">),</span> <span class="n">n</span><span class="p">)):</span>
|
||||
<span class="nb">print</span> <span class="n">s</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="o">.</span><span class="mf">111.</span><span class="p">)</span> <span class="o">&</span> <span class="p">((</span><span class="o">.</span><span class="mi">01</span> <span class="o">|</span> <span class="mi">11</span><span class="o">*</span><span class="p">)</span><span class="s1">')</span>
|
||||
@@ -555,45 +555,45 @@ a --1--> ∂1(a)
|
||||
<p>You can see the one-way nature of the <code class="docutils literal notranslate"><span class="pre">g</span></code> state and the <code class="docutils literal notranslate"><span class="pre">hij</span></code> “trap”
|
||||
in the way that the <code class="docutils literal notranslate"><span class="pre">.111.</span></code> on the left-hand side of the <code class="docutils literal notranslate"><span class="pre">&</span></code>
|
||||
disappears once it has been matched.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>from collections import defaultdict
|
||||
from pprint import pprint
|
||||
from string import ascii_lowercase
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">defaultdict</span>
|
||||
<span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span>
|
||||
<span class="kn">from</span> <span class="nn">string</span> <span class="kn">import</span> <span class="n">ascii_lowercase</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>d0, d1 = D_compaction('0'), D_compaction('1')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">d0</span><span class="p">,</span> <span class="n">d1</span> <span class="o">=</span> <span class="n">D_compaction</span><span class="p">(</span><span class="s1">'0'</span><span class="p">),</span> <span class="n">D_compaction</span><span class="p">(</span><span class="s1">'1'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</section>
|
||||
<section id="explore">
|
||||
<h3><code class="docutils literal notranslate"><span class="pre">explore()</span></code><a class="headerlink" href="#explore" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>def explore(re):
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">explore</span><span class="p">(</span><span class="n">re</span><span class="p">):</span>
|
||||
|
||||
# Don't have more than 26 states...
|
||||
names = defaultdict(iter(ascii_lowercase).next)
|
||||
<span class="c1"># Don't have more than 26 states...</span>
|
||||
<span class="n">names</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="nb">iter</span><span class="p">(</span><span class="n">ascii_lowercase</span><span class="p">)</span><span class="o">.</span><span class="n">next</span><span class="p">)</span>
|
||||
|
||||
table, accepting = dict(), set()
|
||||
<span class="n">table</span><span class="p">,</span> <span class="n">accepting</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(),</span> <span class="nb">set</span><span class="p">()</span>
|
||||
|
||||
to_check = {re}
|
||||
while to_check:
|
||||
<span class="n">to_check</span> <span class="o">=</span> <span class="p">{</span><span class="n">re</span><span class="p">}</span>
|
||||
<span class="k">while</span> <span class="n">to_check</span><span class="p">:</span>
|
||||
|
||||
re = to_check.pop()
|
||||
state_name = names[re]
|
||||
<span class="n">re</span> <span class="o">=</span> <span class="n">to_check</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
|
||||
<span class="n">state_name</span> <span class="o">=</span> <span class="n">names</span><span class="p">[</span><span class="n">re</span><span class="p">]</span>
|
||||
|
||||
if (state_name, 0) in table:
|
||||
continue
|
||||
<span class="k">if</span> <span class="p">(</span><span class="n">state_name</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="ow">in</span> <span class="n">table</span><span class="p">:</span>
|
||||
<span class="k">continue</span>
|
||||
|
||||
if nully(re):
|
||||
accepting.add(state_name)
|
||||
<span class="k">if</span> <span class="n">nully</span><span class="p">(</span><span class="n">re</span><span class="p">):</span>
|
||||
<span class="n">accepting</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">state_name</span><span class="p">)</span>
|
||||
|
||||
o, i = d0(re), d1(re)
|
||||
table[state_name, 0] = names[o] ; to_check.add(o)
|
||||
table[state_name, 1] = names[i] ; to_check.add(i)
|
||||
<span class="n">o</span><span class="p">,</span> <span class="n">i</span> <span class="o">=</span> <span class="n">d0</span><span class="p">(</span><span class="n">re</span><span class="p">),</span> <span class="n">d1</span><span class="p">(</span><span class="n">re</span><span class="p">)</span>
|
||||
<span class="n">table</span><span class="p">[</span><span class="n">state_name</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">names</span><span class="p">[</span><span class="n">o</span><span class="p">]</span> <span class="p">;</span> <span class="n">to_check</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">o</span><span class="p">)</span>
|
||||
<span class="n">table</span><span class="p">[</span><span class="n">state_name</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">names</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="p">;</span> <span class="n">to_check</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
|
||||
|
||||
return table, accepting
|
||||
<span class="k">return</span> <span class="n">table</span><span class="p">,</span> <span class="n">accepting</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>table, accepting = explore(it)
|
||||
table
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">table</span><span class="p">,</span> <span class="n">accepting</span> <span class="o">=</span> <span class="n">explore</span><span class="p">(</span><span class="n">it</span><span class="p">)</span>
|
||||
<span class="n">table</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">{(</span><span class="s1">'a'</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span> <span class="s1">'b'</span><span class="p">,</span>
|
||||
@@ -618,7 +618,7 @@ table
|
||||
<span class="p">(</span><span class="s1">'j'</span><span class="p">,</span> <span class="mi">1</span><span class="p">):</span> <span class="s1">'h'</span><span class="p">}</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>accepting
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">accepting</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">{</span><span class="s1">'h'</span><span class="p">,</span> <span class="s1">'i'</span><span class="p">}</span>
|
||||
@@ -629,31 +629,31 @@ table
|
||||
<h3>Generate Diagram<a class="headerlink" href="#generate-diagram" title="Permalink to this headline">¶</a></h3>
|
||||
<p>Once we have the FSM table and the set of accepting states we can
|
||||
generate the diagram above.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>_template = '''\
|
||||
digraph finite_state_machine {
|
||||
rankdir=LR;
|
||||
size="8,5"
|
||||
node [shape = doublecircle]; %s;
|
||||
node [shape = circle];
|
||||
%s
|
||||
}
|
||||
'''
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">_template</span> <span class="o">=</span> <span class="s1">'''</span><span class="se">\</span>
|
||||
<span class="s1">digraph finite_state_machine {</span>
|
||||
<span class="s1"> rankdir=LR;</span>
|
||||
<span class="s1"> size="8,5"</span>
|
||||
<span class="s1"> node [shape = doublecircle]; </span><span class="si">%s</span><span class="s1">;</span>
|
||||
<span class="s1"> node [shape = circle];</span>
|
||||
<span class="si">%s</span><span class="s1"></span>
|
||||
<span class="s1">}</span>
|
||||
<span class="s1">'''</span>
|
||||
|
||||
def link(fr, nm, label):
|
||||
return ' %s -> %s [ label = "%s" ];' % (fr, nm, label)
|
||||
<span class="k">def</span> <span class="nf">link</span><span class="p">(</span><span class="n">fr</span><span class="p">,</span> <span class="n">nm</span><span class="p">,</span> <span class="n">label</span><span class="p">):</span>
|
||||
<span class="k">return</span> <span class="s1">' </span><span class="si">%s</span><span class="s1"> -> </span><span class="si">%s</span><span class="s1"> [ label = "</span><span class="si">%s</span><span class="s1">" ];'</span> <span class="o">%</span> <span class="p">(</span><span class="n">fr</span><span class="p">,</span> <span class="n">nm</span><span class="p">,</span> <span class="n">label</span><span class="p">)</span>
|
||||
|
||||
|
||||
def make_graph(table, accepting):
|
||||
return _template % (
|
||||
' '.join(accepting),
|
||||
'\n'.join(
|
||||
link(from_, to, char)
|
||||
for (from_, char), (to) in sorted(table.iteritems())
|
||||
)
|
||||
)
|
||||
<span class="k">def</span> <span class="nf">make_graph</span><span class="p">(</span><span class="n">table</span><span class="p">,</span> <span class="n">accepting</span><span class="p">):</span>
|
||||
<span class="k">return</span> <span class="n">_template</span> <span class="o">%</span> <span class="p">(</span>
|
||||
<span class="s1">' '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">accepting</span><span class="p">),</span>
|
||||
<span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
|
||||
<span class="n">link</span><span class="p">(</span><span class="n">from_</span><span class="p">,</span> <span class="n">to</span><span class="p">,</span> <span class="n">char</span><span class="p">)</span>
|
||||
<span class="k">for</span> <span class="p">(</span><span class="n">from_</span><span class="p">,</span> <span class="n">char</span><span class="p">),</span> <span class="p">(</span><span class="n">to</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">table</span><span class="o">.</span><span class="n">iteritems</span><span class="p">())</span>
|
||||
<span class="p">)</span>
|
||||
<span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>print make_graph(table, accepting)
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">make_graph</span><span class="p">(</span><span class="n">table</span><span class="p">,</span> <span class="n">accepting</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">digraph</span> <span class="n">finite_state_machine</span> <span class="p">{</span>
|
||||
@@ -699,14 +699,14 @@ hard-code the information in the table into a little patch of branches.</p>
|
||||
<h4>Trampoline Function<a class="headerlink" href="#trampoline-function" title="Permalink to this headline">¶</a></h4>
|
||||
<p>Python has no GOTO statement but we can fake it with a “trampoline”
|
||||
function.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>def trampoline(input_, jump_from, accepting):
|
||||
I = iter(input_)
|
||||
while True:
|
||||
try:
|
||||
bounce_to = jump_from(I)
|
||||
except StopIteration:
|
||||
return jump_from in accepting
|
||||
jump_from = bounce_to
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">trampoline</span><span class="p">(</span><span class="n">input_</span><span class="p">,</span> <span class="n">jump_from</span><span class="p">,</span> <span class="n">accepting</span><span class="p">):</span>
|
||||
<span class="n">I</span> <span class="o">=</span> <span class="nb">iter</span><span class="p">(</span><span class="n">input_</span><span class="p">)</span>
|
||||
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
<span class="n">bounce_to</span> <span class="o">=</span> <span class="n">jump_from</span><span class="p">(</span><span class="n">I</span><span class="p">)</span>
|
||||
<span class="k">except</span> <span class="ne">StopIteration</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="n">jump_from</span> <span class="ow">in</span> <span class="n">accepting</span>
|
||||
<span class="n">jump_from</span> <span class="o">=</span> <span class="n">bounce_to</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -714,17 +714,17 @@ function.</p>
|
||||
<h4>Stream Functions<a class="headerlink" href="#stream-functions" title="Permalink to this headline">¶</a></h4>
|
||||
<p>Little helpers to process the iterator of our data (a “stream” of “1”
|
||||
and “0” characters, not bits.)</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>getch = lambda I: int(next(I))
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">getch</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">I</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="nb">next</span><span class="p">(</span><span class="n">I</span><span class="p">))</span>
|
||||
|
||||
|
||||
def _1(I):
|
||||
'''Loop on ones.'''
|
||||
while getch(I): pass
|
||||
<span class="k">def</span> <span class="nf">_1</span><span class="p">(</span><span class="n">I</span><span class="p">):</span>
|
||||
<span class="sd">'''Loop on ones.'''</span>
|
||||
<span class="k">while</span> <span class="n">getch</span><span class="p">(</span><span class="n">I</span><span class="p">):</span> <span class="k">pass</span>
|
||||
|
||||
|
||||
def _0(I):
|
||||
'''Loop on zeros.'''
|
||||
while not getch(I): pass
|
||||
<span class="k">def</span> <span class="nf">_0</span><span class="p">(</span><span class="n">I</span><span class="p">):</span>
|
||||
<span class="sd">'''Loop on zeros.'''</span>
|
||||
<span class="k">while</span> <span class="ow">not</span> <span class="n">getch</span><span class="p">(</span><span class="n">I</span><span class="p">):</span> <span class="k">pass</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -735,28 +735,28 @@ def _0(I):
|
||||
code. (You have to imagine that these are GOTO statements in C or
|
||||
branches in assembly and that the state names are branch destination
|
||||
labels.)</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>a = lambda I: c if getch(I) else b
|
||||
b = lambda I: _0(I) or d
|
||||
c = lambda I: e if getch(I) else b
|
||||
d = lambda I: f if getch(I) else b
|
||||
e = lambda I: g if getch(I) else b
|
||||
f = lambda I: h if getch(I) else b
|
||||
g = lambda I: _1(I) or i
|
||||
h = lambda I: _1(I) or i
|
||||
i = lambda I: _0(I) or j
|
||||
j = lambda I: h if getch(I) else i
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">a</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">I</span><span class="p">:</span> <span class="n">c</span> <span class="k">if</span> <span class="n">getch</span><span class="p">(</span><span class="n">I</span><span class="p">)</span> <span class="k">else</span> <span class="n">b</span>
|
||||
<span class="n">b</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">I</span><span class="p">:</span> <span class="n">_0</span><span class="p">(</span><span class="n">I</span><span class="p">)</span> <span class="ow">or</span> <span class="n">d</span>
|
||||
<span class="n">c</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">I</span><span class="p">:</span> <span class="n">e</span> <span class="k">if</span> <span class="n">getch</span><span class="p">(</span><span class="n">I</span><span class="p">)</span> <span class="k">else</span> <span class="n">b</span>
|
||||
<span class="n">d</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">I</span><span class="p">:</span> <span class="n">f</span> <span class="k">if</span> <span class="n">getch</span><span class="p">(</span><span class="n">I</span><span class="p">)</span> <span class="k">else</span> <span class="n">b</span>
|
||||
<span class="n">e</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">I</span><span class="p">:</span> <span class="n">g</span> <span class="k">if</span> <span class="n">getch</span><span class="p">(</span><span class="n">I</span><span class="p">)</span> <span class="k">else</span> <span class="n">b</span>
|
||||
<span class="n">f</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">I</span><span class="p">:</span> <span class="n">h</span> <span class="k">if</span> <span class="n">getch</span><span class="p">(</span><span class="n">I</span><span class="p">)</span> <span class="k">else</span> <span class="n">b</span>
|
||||
<span class="n">g</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">I</span><span class="p">:</span> <span class="n">_1</span><span class="p">(</span><span class="n">I</span><span class="p">)</span> <span class="ow">or</span> <span class="n">i</span>
|
||||
<span class="n">h</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">I</span><span class="p">:</span> <span class="n">_1</span><span class="p">(</span><span class="n">I</span><span class="p">)</span> <span class="ow">or</span> <span class="n">i</span>
|
||||
<span class="n">i</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">I</span><span class="p">:</span> <span class="n">_0</span><span class="p">(</span><span class="n">I</span><span class="p">)</span> <span class="ow">or</span> <span class="n">j</span>
|
||||
<span class="n">j</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">I</span><span class="p">:</span> <span class="n">h</span> <span class="k">if</span> <span class="n">getch</span><span class="p">(</span><span class="n">I</span><span class="p">)</span> <span class="k">else</span> <span class="n">i</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Note that the implementations of <code class="docutils literal notranslate"><span class="pre">h</span></code> and <code class="docutils literal notranslate"><span class="pre">g</span></code> are identical ergo
|
||||
<code class="docutils literal notranslate"><span class="pre">h</span> <span class="pre">=</span> <span class="pre">g</span></code> and we could eliminate one in the code but <code class="docutils literal notranslate"><span class="pre">h</span></code> is an
|
||||
accepting state and <code class="docutils literal notranslate"><span class="pre">g</span></code> isn’t.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>def acceptable(input_):
|
||||
return trampoline(input_, a, {h, i})
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">acceptable</span><span class="p">(</span><span class="n">input_</span><span class="p">):</span>
|
||||
<span class="k">return</span> <span class="n">trampoline</span><span class="p">(</span><span class="n">input_</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="p">{</span><span class="n">h</span><span class="p">,</span> <span class="n">i</span><span class="p">})</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>for n in range(2**5):
|
||||
s = bin(n)[2:]
|
||||
print '%05s' % s, acceptable(s)
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="o">**</span><span class="mi">5</span><span class="p">):</span>
|
||||
<span class="n">s</span> <span class="o">=</span> <span class="nb">bin</span><span class="p">(</span><span class="n">n</span><span class="p">)[</span><span class="mi">2</span><span class="p">:]</span>
|
||||
<span class="nb">print</span> <span class="s1">'</span><span class="si">%05s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">s</span><span class="p">,</span> <span class="n">acceptable</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="mi">0</span> <span class="kc">False</span>
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -157,33 +157,33 @@ like that.</p>
|
||||
</section>
|
||||
<section id="examples">
|
||||
<h3>Examples<a class="headerlink" href="#examples" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>joy.parser.text_to_expression('1 2 3 4 5') # A simple sequence.
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">joy</span><span class="o">.</span><span class="n">parser</span><span class="o">.</span><span class="n">text_to_expression</span><span class="p">(</span><span class="s1">'1 2 3 4 5'</span><span class="p">)</span> <span class="c1"># A simple sequence.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="p">())))))</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>joy.parser.text_to_expression('[1 2 3] 4 5') # Three items, the first is a list with three items
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">joy</span><span class="o">.</span><span class="n">parser</span><span class="o">.</span><span class="n">text_to_expression</span><span class="p">(</span><span class="s1">'[1 2 3] 4 5'</span><span class="p">)</span> <span class="c1"># Three items, the first is a list with three items</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((</span><span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="p">()))),</span> <span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="p">())))</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>joy.parser.text_to_expression('1 23 ["four" [-5.0] cons] 8888') # A mixed bag. cons is
|
||||
# a Symbol, no lookup at
|
||||
# parse-time. Haiku docs.
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">joy</span><span class="o">.</span><span class="n">parser</span><span class="o">.</span><span class="n">text_to_expression</span><span class="p">(</span><span class="s1">'1 23 ["four" [-5.0] cons] 8888'</span><span class="p">)</span> <span class="c1"># A mixed bag. cons is</span>
|
||||
<span class="c1"># a Symbol, no lookup at</span>
|
||||
<span class="c1"># parse-time. Haiku docs.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">23</span><span class="p">,</span> <span class="p">((</span><span class="s1">'four'</span><span class="p">,</span> <span class="p">((</span><span class="o">-</span><span class="mf">5.0</span><span class="p">,</span> <span class="p">()),</span> <span class="p">(</span><span class="n">cons</span><span class="p">,</span> <span class="p">()))),</span> <span class="p">(</span><span class="mi">8888</span><span class="p">,</span> <span class="p">()))))</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>joy.parser.text_to_expression('[][][][][]') # Five empty lists.
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">joy</span><span class="o">.</span><span class="n">parser</span><span class="o">.</span><span class="n">text_to_expression</span><span class="p">(</span><span class="s1">'[][][][][]'</span><span class="p">)</span> <span class="c1"># Five empty lists.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((),</span> <span class="p">((),</span> <span class="p">((),</span> <span class="p">((),</span> <span class="p">((),</span> <span class="p">())))))</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>joy.parser.text_to_expression('[[[[[]]]]]') # Five nested lists.
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">joy</span><span class="o">.</span><span class="n">parser</span><span class="o">.</span><span class="n">text_to_expression</span><span class="p">(</span><span class="s1">'[[[[[]]]]]'</span><span class="p">)</span> <span class="c1"># Five nested lists.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">((((((),</span> <span class="p">()),</span> <span class="p">()),</span> <span class="p">()),</span> <span class="p">()),</span> <span class="p">())</span>
|
||||
@@ -199,7 +199,7 @@ the Joy system. There are simple functions such as addition <code class="docutil
|
||||
<code class="docutils literal notranslate"><span class="pre">+</span></code>, the library module supports aliases), and combinators which
|
||||
provide control-flow and higher-order operations.</p>
|
||||
<p>Many of the functions are defined in Python, like <code class="docutils literal notranslate"><span class="pre">dip</span></code>:</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>print inspect.getsource(joy.library.dip)
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">inspect</span><span class="o">.</span><span class="n">getsource</span><span class="p">(</span><span class="n">joy</span><span class="o">.</span><span class="n">library</span><span class="o">.</span><span class="n">dip</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">dip</span><span class="p">(</span><span class="n">stack</span><span class="p">,</span> <span class="n">expression</span><span class="p">,</span> <span class="n">dictionary</span><span class="p">):</span>
|
||||
@@ -212,7 +212,7 @@ provide control-flow and higher-order operations.</p>
|
||||
When the interpreter executes a definition function that function just
|
||||
pushes its body expression onto the pending expression (the
|
||||
continuation) and returns control to the interpreter.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>print joy.library.definitions
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">joy</span><span class="o">.</span><span class="n">library</span><span class="o">.</span><span class="n">definitions</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<pre class="literal-block">second == rest first
|
||||
|
||||
@@ -63,7 +63,7 @@ the Sufficiently Smart Compiler can be modified to use an optimized
|
||||
implementation under the hood. (Where does the “type” come from? It has
|
||||
a contingent existence predicated on the disciplined use of these
|
||||
functions on otherwise undistinguished Joy datastructures.)</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>from notebook_preamble import D, J, V, define, DefinitionWrapper
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="kn">import</span> <span class="n">D</span><span class="p">,</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span><span class="p">,</span> <span class="n">define</span><span class="p">,</span> <span class="n">DefinitionWrapper</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<section id="adding-nodes-to-the-tree">
|
||||
@@ -100,10 +100,10 @@ functions on otherwise undistinguished Joy datastructures.)</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Tree</span><span class="o">-</span><span class="n">new</span> <span class="o">==</span> <span class="n">swap</span> <span class="p">[[]</span> <span class="p">[]]</span> <span class="n">cons</span> <span class="n">cons</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>define('Tree-new == swap [[] []] cons cons')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'Tree-new == swap [[] []] cons cons'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('"v" "k" Tree-new')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'"v" "k" Tree-new'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'k'</span> <span class="s1">'v'</span> <span class="p">[]</span> <span class="p">[]]</span>
|
||||
@@ -159,10 +159,10 @@ comparison operator:</p>
|
||||
<span class="n">P</span> <span class="o">==</span> <span class="n">pop</span> <span class="n">roll</span><span class="o">></span> <span class="n">pop</span> <span class="n">first</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>define('P == pop roll> pop first')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'P == pop roll> pop first'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('["old_key" 23 [] []] 17 "new_key" ["..."] P')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'["old_key" 23 [] []] 17 "new_key" ["..."] P'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">'new_key'</span> <span class="s1">'old_key'</span>
|
||||
@@ -217,10 +217,10 @@ stack:</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">T</span> <span class="o">==</span> <span class="n">cons</span> <span class="n">cons</span> <span class="p">[</span><span class="n">dipdd</span><span class="p">]</span> <span class="n">cons</span> <span class="n">infra</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>define('T == cons cons [dipdd] cons infra')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'T == cons cons [dipdd] cons infra'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('["old_k" "old_value" "left" "right"] "new_value" "new_key" ["Tree-add"] T')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'["old_k" "old_value" "left" "right"] "new_value" "new_key" ["Tree-add"] T'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'old_k'</span> <span class="s1">'old_value'</span> <span class="s1">'left'</span> <span class="s1">'Tree-add'</span> <span class="s1">'new_key'</span> <span class="s1">'new_value'</span> <span class="s1">'right'</span><span class="p">]</span>
|
||||
@@ -234,7 +234,7 @@ stack:</p>
|
||||
<span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">Tree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="p">[</span><span class="n">P</span> <span class="o"><</span><span class="p">]</span> <span class="p">[</span><span class="n">Te</span><span class="p">]</span> <span class="p">[</span><span class="n">Ee</span><span class="p">]</span> <span class="n">ifte</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>define('E == [P <] [Te] [Ee] ifte')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'E == [P <] [Te] [Ee] ifte'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>In this case <code class="docutils literal notranslate"><span class="pre">Te</span></code> works that same as <code class="docutils literal notranslate"><span class="pre">T</span></code> but on the left child tree
|
||||
@@ -243,10 +243,10 @@ instead of the right, so the only difference is that it must use
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Te</span> <span class="o">==</span> <span class="n">cons</span> <span class="n">cons</span> <span class="p">[</span><span class="n">dipd</span><span class="p">]</span> <span class="n">cons</span> <span class="n">infra</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>define('Te == cons cons [dipd] cons infra')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'Te == cons cons [dipd] cons infra'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('["old_k" "old_value" "left" "right"] "new_value" "new_key" ["Tree-add"] Te')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'["old_k" "old_value" "left" "right"] "new_value" "new_key" ["Tree-add"] Te'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'old_k'</span> <span class="s1">'old_value'</span> <span class="s1">'Tree-add'</span> <span class="s1">'new_key'</span> <span class="s1">'new_value'</span> <span class="s1">'left'</span> <span class="s1">'right'</span><span class="p">]</span>
|
||||
@@ -274,10 +274,10 @@ instead of the right, so the only difference is that it must use
|
||||
<span class="p">[</span><span class="n">key</span> <span class="n">new_value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>define('Ee == pop swap roll< rest rest cons cons')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'Ee == pop swap roll< rest rest cons cons'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('["k" "old_value" "left" "right"] "new_value" "k" ["Tree-add"] Ee')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'["k" "old_value" "left" "right"] "new_value" "k" ["Tree-add"] Ee'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'k'</span> <span class="s1">'new_value'</span> <span class="s1">'left'</span> <span class="s1">'right'</span><span class="p">]</span>
|
||||
@@ -302,43 +302,43 @@ instead of the right, so the only difference is that it must use
|
||||
<span class="n">Tree</span><span class="o">-</span><span class="n">add</span> <span class="o">==</span> <span class="p">[</span><span class="n">popop</span> <span class="ow">not</span><span class="p">]</span> <span class="p">[[</span><span class="n">pop</span><span class="p">]</span> <span class="n">dipd</span> <span class="n">Tree</span><span class="o">-</span><span class="n">new</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[</span><span class="n">R</span><span class="p">]</span> <span class="n">genrec</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>define('Tree-add == [popop not] [[pop] dipd Tree-new] [] [[P >] [T] [E] ifte] genrec')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'Tree-add == [popop not] [[pop] dipd Tree-new] [] [[P >] [T] [E] ifte] genrec'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</section>
|
||||
<section id="examples">
|
||||
<h3>Examples<a class="headerlink" href="#examples" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[] 23 "b" Tree-add') # Initial
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[] 23 "b" Tree-add'</span><span class="p">)</span> <span class="c1"># Initial</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'b'</span> <span class="mi">23</span> <span class="p">[]</span> <span class="p">[]]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('["b" 23 [] []] 88 "c" Tree-add') # Greater than
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'["b" 23 [] []] 88 "c" Tree-add'</span><span class="p">)</span> <span class="c1"># Greater than</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'b'</span> <span class="mi">23</span> <span class="p">[]</span> <span class="p">[</span><span class="s1">'c'</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[]]]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('["b" 23 [] []] 88 "a" Tree-add') # Less than
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'["b" 23 [] []] 88 "a" Tree-add'</span><span class="p">)</span> <span class="c1"># Less than</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'b'</span> <span class="mi">23</span> <span class="p">[</span><span class="s1">'a'</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[]]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('["b" 23 [] []] 88 "b" Tree-add') # Equal to
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'["b" 23 [] []] 88 "b" Tree-add'</span><span class="p">)</span> <span class="c1"># Equal to</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'b'</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[]]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[] 23 "b" Tree-add 88 "a" Tree-add 44 "c" Tree-add') # Series.
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[] 23 "b" Tree-add 88 "a" Tree-add 44 "c" Tree-add'</span><span class="p">)</span> <span class="c1"># Series.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'b'</span> <span class="mi">23</span> <span class="p">[</span><span class="s1">'a'</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="s1">'c'</span> <span class="mi">44</span> <span class="p">[]</span> <span class="p">[]]]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[] [[23 "b"] [88 "a"] [44 "c"]] [i Tree-add] step')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[] [[23 "b"] [88 "a"] [44 "c"]] [i Tree-add] step'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'b'</span> <span class="mi">23</span> <span class="p">[</span><span class="s1">'a'</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="s1">'c'</span> <span class="mi">44</span> <span class="p">[]</span> <span class="p">[]]]</span>
|
||||
@@ -365,19 +365,19 @@ values:</p>
|
||||
<span class="n">L</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J("1 0 ['G'] ['E'] ['L'] cmp")
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"1 0 ['G'] ['E'] ['L'] cmp"</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">'G'</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J("1 1 ['G'] ['E'] ['L'] cmp")
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"1 1 ['G'] ['E'] ['L'] cmp"</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">'E'</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J("0 1 ['G'] ['E'] ['L'] cmp")
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"0 1 ['G'] ['E'] ['L'] cmp"</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">'L'</span>
|
||||
@@ -414,7 +414,7 @@ node key (by throwing everything else away):</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">P</span> <span class="o">==</span> <span class="n">over</span> <span class="p">[</span><span class="n">popop</span> <span class="n">popop</span> <span class="n">first</span><span class="p">]</span> <span class="n">nullary</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>define('P == over [popop popop first] nullary')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'P == over [popop popop first] nullary'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Using <code class="docutils literal notranslate"><span class="pre">cmp</span></code> to simplify <cite>our code above at
|
||||
@@ -434,10 +434,10 @@ to understand:</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Tree</span><span class="o">-</span><span class="n">add</span> <span class="o">==</span> <span class="p">[</span><span class="n">popop</span> <span class="ow">not</span><span class="p">]</span> <span class="p">[[</span><span class="n">pop</span><span class="p">]</span> <span class="n">dipd</span> <span class="n">Tree</span><span class="o">-</span><span class="n">new</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[</span><span class="n">P</span> <span class="p">[</span><span class="n">T</span><span class="p">]</span> <span class="p">[</span><span class="n">Ee</span><span class="p">]</span> <span class="p">[</span><span class="n">Te</span><span class="p">]</span> <span class="n">cmp</span><span class="p">]</span> <span class="n">genrec</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>define('Tree-add == [popop not] [[pop] dipd Tree-new] [] [P [T] [Ee] [Te] cmp] genrec')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'Tree-add == [popop not] [[pop] dipd Tree-new] [] [P [T] [Ee] [Te] cmp] genrec'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[] 23 "b" Tree-add 88 "a" Tree-add 44 "c" Tree-add') # Still works.
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[] 23 "b" Tree-add 88 "a" Tree-add 44 "c" Tree-add'</span><span class="p">)</span> <span class="c1"># Still works.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'b'</span> <span class="mi">23</span> <span class="p">[</span><span class="s1">'a'</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="s1">'c'</span> <span class="mi">44</span> <span class="p">[]</span> <span class="p">[]]]</span>
|
||||
@@ -545,22 +545,22 @@ with an interesting situation:</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Tree</span><span class="o">-</span><span class="nb">iter</span> <span class="o">==</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="n">roll</span><span class="o"><</span> <span class="p">[</span><span class="n">dupdip</span> <span class="n">rest</span> <span class="n">rest</span><span class="p">]</span> <span class="n">cons</span> <span class="p">[</span><span class="n">step</span><span class="p">]</span> <span class="n">genrec</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>define('Tree-iter == [not] [pop] roll< [dupdip rest rest] cons [step] genrec')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'Tree-iter == [not] [pop] roll< [dupdip rest rest] cons [step] genrec'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</section>
|
||||
<section id="id1">
|
||||
<h3>Examples<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[] [foo] Tree-iter') # It doesn't matter what F is as it won't be used.
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[] [foo] Tree-iter'</span><span class="p">)</span> <span class="c1"># It doesn't matter what F is as it won't be used.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J("['b' 23 ['a' 88 [] []] ['c' 44 [] []]] [first] Tree-iter")
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"['b' 23 ['a' 88 [] []] ['c' 44 [] []]] [first] Tree-iter"</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">'b'</span> <span class="s1">'a'</span> <span class="s1">'c'</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J("['b' 23 ['a' 88 [] []] ['c' 44 [] []]] [second] Tree-iter")
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"['b' 23 ['a' 88 [] []] ['c' 44 [] []]] [second] Tree-iter"</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">23</span> <span class="mi">88</span> <span class="mi">44</span>
|
||||
@@ -575,16 +575,16 @@ to e.g. 0 and ignoring them. It’s set-like in that duplicate items added
|
||||
to it will only occur once within it, and we can query it in
|
||||
<cite>:math:`O(log_2 N)</cite> <<a class="reference external" href="https://en.wikipedia.org/wiki/Binary_search_tree#cite_note-2">https://en.wikipedia.org/wiki/Binary_search_tree#cite_note-2</a>>`__
|
||||
time.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[] [3 9 5 2 8 6 7 8 4] [0 swap Tree-add] step')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[] [3 9 5 2 8 6 7 8 4] [0 swap Tree-add] step'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">3</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">9</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">5</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">8</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">6</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[</span><span class="mi">7</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]]</span> <span class="p">[]]]</span> <span class="p">[]]]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>define('to_set == [] swap [0 swap Tree-add] step')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'to_set == [] swap [0 swap Tree-add] step'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[3 9 5 2 8 6 7 8 4] to_set')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[3 9 5 2 8 6 7 8 4] to_set'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">3</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">9</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">5</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">8</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">6</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[</span><span class="mi">7</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]]</span> <span class="p">[]]]</span> <span class="p">[]]]</span>
|
||||
@@ -592,10 +592,10 @@ time.</p>
|
||||
</div>
|
||||
<p>And with that we can write a little program <code class="docutils literal notranslate"><span class="pre">unique</span></code> to remove
|
||||
duplicate items from a list.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>define('unique == [to_set [first] Tree-iter] cons run')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'unique == [to_set [first] Tree-iter] cons run'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[3 9 3 5 2 9 8 8 8 6 2 7 8 4 3] unique') # Filter duplicate items.
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[3 9 3 5 2 9 8 8 8 6 2 7 8 4 3] unique'</span><span class="p">)</span> <span class="c1"># Filter duplicate items.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">7</span> <span class="mi">6</span> <span class="mi">8</span> <span class="mi">4</span> <span class="mi">5</span> <span class="mi">9</span> <span class="mi">2</span> <span class="mi">3</span><span class="p">]</span>
|
||||
@@ -679,23 +679,23 @@ right side:</p>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Now we can sort sequences.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>#define('Tree-iter-order == [not] [pop] [dup third] [[cons dip] dupdip [[first] dupdip] dip [rest rest rest first] dip i] genrec')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1">#define('Tree-iter-order == [not] [pop] [dup third] [[cons dip] dupdip [[first] dupdip] dip [rest rest rest first] dip i] genrec')</span>
|
||||
|
||||
|
||||
DefinitionWrapper.add_definitions('''
|
||||
<span class="n">DefinitionWrapper</span><span class="o">.</span><span class="n">add_definitions</span><span class="p">(</span><span class="s1">'''</span>
|
||||
|
||||
fourth == rest rest rest first
|
||||
<span class="s1">fourth == rest rest rest first</span>
|
||||
|
||||
proc_left == [cons dip] dupdip
|
||||
proc_current == [[first] dupdip] dip
|
||||
proc_right == [fourth] dip i
|
||||
<span class="s1">proc_left == [cons dip] dupdip</span>
|
||||
<span class="s1">proc_current == [[first] dupdip] dip</span>
|
||||
<span class="s1">proc_right == [fourth] dip i</span>
|
||||
|
||||
Tree-iter-order == [not] [pop] [dup third] [proc_left proc_current proc_right] genrec
|
||||
<span class="s1">Tree-iter-order == [not] [pop] [dup third] [proc_left proc_current proc_right] genrec</span>
|
||||
|
||||
''', D)
|
||||
<span class="s1">'''</span><span class="p">,</span> <span class="n">D</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[3 9 5 2 8 6 7 8 4] to_set Tree-iter-order')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[3 9 5 2 8 6 7 8 4] to_set Tree-iter-order'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span> <span class="mi">5</span> <span class="mi">6</span> <span class="mi">7</span> <span class="mi">8</span> <span class="mi">9</span>
|
||||
@@ -835,54 +835,54 @@ because there’s no value to discard.</p>
|
||||
<span class="n">Tree</span><span class="o">-</span><span class="n">get</span> <span class="o">==</span> <span class="p">[</span><span class="n">pop</span> <span class="ow">not</span><span class="p">]</span> <span class="n">swap</span> <span class="p">[]</span> <span class="p">[</span><span class="n">P</span> <span class="p">[</span><span class="n">T</span><span class="o">></span><span class="p">]</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="p">[</span><span class="n">T</span><span class="o"><</span><span class="p">]</span> <span class="n">cmp</span><span class="p">]</span> <span class="n">genrec</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span># I don't want to deal with name conflicts with the above so I'm inlining everything here.
|
||||
# The original Joy system has "hide" which is a meta-command which allows you to use named
|
||||
# definitions that are only in scope for a given definition. I don't want to implement
|
||||
# that (yet) so...
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># I don't want to deal with name conflicts with the above so I'm inlining everything here.</span>
|
||||
<span class="c1"># The original Joy system has "hide" which is a meta-command which allows you to use named</span>
|
||||
<span class="c1"># definitions that are only in scope for a given definition. I don't want to implement</span>
|
||||
<span class="c1"># that (yet) so...</span>
|
||||
|
||||
|
||||
define('''
|
||||
Tree-get == [pop not] swap [] [
|
||||
over [pop popop first] nullary
|
||||
[[fourth] dipd i]
|
||||
[popop second]
|
||||
[[third] dipd i]
|
||||
cmp
|
||||
] genrec
|
||||
''')
|
||||
<span class="n">define</span><span class="p">(</span><span class="s1">'''</span>
|
||||
<span class="s1">Tree-get == [pop not] swap [] [</span>
|
||||
<span class="s1"> over [pop popop first] nullary</span>
|
||||
<span class="s1"> [[fourth] dipd i]</span>
|
||||
<span class="s1"> [popop second]</span>
|
||||
<span class="s1"> [[third] dipd i]</span>
|
||||
<span class="s1"> cmp</span>
|
||||
<span class="s1"> ] genrec</span>
|
||||
<span class="s1">'''</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('["gary" 23 [] []] "mike" [popd " not in tree" +] Tree-get')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'["gary" 23 [] []] "mike" [popd " not in tree" +] Tree-get'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">'mike not in tree'</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('["gary" 23 [] []] "gary" [popop "err"] Tree-get')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'["gary" 23 [] []] "gary" [popop "err"] Tree-get'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">23</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('''
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'''</span>
|
||||
|
||||
[] [[0 'a'] [1 'b'] [2 'c']] [i Tree-add] step
|
||||
<span class="s1"> [] [[0 'a'] [1 'b'] [2 'c']] [i Tree-add] step</span>
|
||||
|
||||
'c' [popop 'not found'] Tree-get
|
||||
<span class="s1"> 'c' [popop 'not found'] Tree-get</span>
|
||||
|
||||
''')
|
||||
<span class="s1">'''</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">2</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('''
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'''</span>
|
||||
|
||||
[] [[0 'a'] [1 'b'] [2 'c']] [i Tree-add] step
|
||||
<span class="s1"> [] [[0 'a'] [1 'b'] [2 'c']] [i Tree-add] step</span>
|
||||
|
||||
'd' [popop 'not found'] Tree-get
|
||||
<span class="s1"> 'd' [popop 'not found'] Tree-get</span>
|
||||
|
||||
''')
|
||||
<span class="s1">'''</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">'not found'</span>
|
||||
@@ -1175,61 +1175,61 @@ E == [
|
||||
</div>
|
||||
<p>By the standards of the code I’ve written so far, this is a <em>huge</em> Joy
|
||||
program.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>DefinitionWrapper.add_definitions('''
|
||||
first_two == uncons uncons pop
|
||||
fourth == rest rest rest first
|
||||
?fourth == [] [fourth] [] ifte
|
||||
W.rightmost == [?fourth] [fourth] while
|
||||
E.clear_stuff == roll> popop rest
|
||||
E.delete == cons dipd
|
||||
W == dup W.rightmost first_two over
|
||||
E.0 == E.clear_stuff [W] dip E.delete swap
|
||||
E == [[[pop third not] pop fourth] [[pop fourth not] pop third] [[E.0] cons infra]] cond
|
||||
T> == [dipd] cons infra
|
||||
T< == [dipdd] cons infra
|
||||
R0 == over first swap dup
|
||||
R1 == cons roll> [T>] [E] [T<] cmp
|
||||
Tree-Delete == [pop not] [pop] [R0] [R1] genrec
|
||||
''', D)
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">DefinitionWrapper</span><span class="o">.</span><span class="n">add_definitions</span><span class="p">(</span><span class="s1">'''</span>
|
||||
<span class="s1">first_two == uncons uncons pop</span>
|
||||
<span class="s1">fourth == rest rest rest first</span>
|
||||
<span class="s1">?fourth == [] [fourth] [] ifte</span>
|
||||
<span class="s1">W.rightmost == [?fourth] [fourth] while</span>
|
||||
<span class="s1">E.clear_stuff == roll> popop rest</span>
|
||||
<span class="s1">E.delete == cons dipd</span>
|
||||
<span class="s1">W == dup W.rightmost first_two over</span>
|
||||
<span class="s1">E.0 == E.clear_stuff [W] dip E.delete swap</span>
|
||||
<span class="s1">E == [[[pop third not] pop fourth] [[pop fourth not] pop third] [[E.0] cons infra]] cond</span>
|
||||
<span class="s1">T> == [dipd] cons infra</span>
|
||||
<span class="s1">T< == [dipdd] cons infra</span>
|
||||
<span class="s1">R0 == over first swap dup</span>
|
||||
<span class="s1">R1 == cons roll> [T>] [E] [T<] cmp</span>
|
||||
<span class="s1">Tree-Delete == [pop not] [pop] [R0] [R1] genrec</span>
|
||||
<span class="s1">'''</span><span class="p">,</span> <span class="n">D</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'c' Tree-Delete ")
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'c' Tree-Delete "</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'a'</span> <span class="mi">23</span> <span class="p">[]</span> <span class="p">[</span><span class="s1">'b'</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[]]]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'b' Tree-Delete ")
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'b' Tree-Delete "</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'a'</span> <span class="mi">23</span> <span class="p">[]</span> <span class="p">[</span><span class="s1">'c'</span> <span class="mi">44</span> <span class="p">[]</span> <span class="p">[]]]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'a' Tree-Delete ")
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'a' Tree-Delete "</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'b'</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[</span><span class="s1">'c'</span> <span class="mi">44</span> <span class="p">[]</span> <span class="p">[]]]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J("['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'der' Tree-Delete ")
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"['a' 23 [] ['b' 88 [] ['c' 44 [] []]]] 'der' Tree-Delete "</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'a'</span> <span class="mi">23</span> <span class="p">[]</span> <span class="p">[</span><span class="s1">'b'</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[</span><span class="s1">'c'</span> <span class="mi">44</span> <span class="p">[]</span> <span class="p">[]]]]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[] [4 2 3 1 6 7 5 ] [0 swap Tree-add] step')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[] [4 2 3 1 6 7 5 ] [0 swap Tree-add] step'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">4</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">1</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]]</span> <span class="p">[</span><span class="mi">6</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">5</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">7</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]]]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J("[4 0 [2 0 [1 0 [] []] [3 0 [] []]] [6 0 [5 0 [] []] [7 0 [] []]]] 3 Tree-Delete ")
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"[4 0 [2 0 [1 0 [] []] [3 0 [] []]] [6 0 [5 0 [] []] [7 0 [] []]]] 3 Tree-Delete "</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">4</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">1</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">6</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">5</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">7</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]]]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J("[4 0 [2 0 [1 0 [] []] [3 0 [] []]] [6 0 [5 0 [] []] [7 0 [] []]]] 4 Tree-Delete ")
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">"[4 0 [2 0 [1 0 [] []] [3 0 [] []]] [6 0 [5 0 [] []] [7 0 [] []]]] 4 Tree-Delete "</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">3</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">1</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">6</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">5</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">7</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]]]</span>
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
<div class="body" role="main">
|
||||
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>from notebook_preamble import J, V, define
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="kn">import</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span><span class="p">,</span> <span class="n">define</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<section id="quadratic-formula">
|
||||
@@ -100,11 +100,11 @@ the variables:</p>
|
||||
</div>
|
||||
<p>The three arguments are to the left, so we can “chop off” everything to
|
||||
the right and say it’s the definition of the <code class="docutils literal notranslate"><span class="pre">quadratic</span></code> function:</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>define('quadratic == over [[[neg] dupdip sqr 4] dipd * * - sqrt pm] dip 2 * [/] cons app2')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'quadratic == over [[[neg] dupdip sqr 4] dipd * * - sqrt pm] dip 2 * [/] cons app2'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Let’s try it out:</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('3 1 1 quadratic')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'3 1 1 quadratic'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">-</span><span class="mf">0.3819660112501051</span> <span class="o">-</span><span class="mf">2.618033988749895</span>
|
||||
@@ -114,7 +114,7 @@ the right and say it’s the definition of the <code class="docutils literal not
|
||||
lines are the <code class="docutils literal notranslate"><span class="pre">dip</span></code> and <code class="docutils literal notranslate"><span class="pre">dipd</span></code> combinators building the main program
|
||||
by incorporating the values on the stack. Then that program runs and you
|
||||
get the results. This is pretty typical of Joy code.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>V('-5 1 4 quadratic')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'-5 1 4 quadratic'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="o">-</span><span class="mi">5</span> <span class="mi">1</span> <span class="mi">4</span> <span class="n">quadratic</span>
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
|
||||
<div class="body" role="main">
|
||||
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>from notebook_preamble import D, DefinitionWrapper, J, V, define
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="kn">import</span> <span class="n">D</span><span class="p">,</span> <span class="n">DefinitionWrapper</span><span class="p">,</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span><span class="p">,</span> <span class="n">define</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<section id="recursion-combinators">
|
||||
@@ -101,18 +101,18 @@ cons list”.</p></li>
|
||||
</ul>
|
||||
<p>It may be helpful to see this function implemented in imperative Python
|
||||
code.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>def hylomorphism(c, F, P, G):
|
||||
'''Return a hylomorphism function H.'''
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">hylomorphism</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">F</span><span class="p">,</span> <span class="n">P</span><span class="p">,</span> <span class="n">G</span><span class="p">):</span>
|
||||
<span class="sd">'''Return a hylomorphism function H.'''</span>
|
||||
|
||||
def H(a):
|
||||
if P(a):
|
||||
result = c
|
||||
else:
|
||||
b, aa = G(a)
|
||||
result = F(b, H(aa)) # b is stored in the stack frame during recursive call to H().
|
||||
return result
|
||||
<span class="k">def</span> <span class="nf">H</span><span class="p">(</span><span class="n">a</span><span class="p">):</span>
|
||||
<span class="k">if</span> <span class="n">P</span><span class="p">(</span><span class="n">a</span><span class="p">):</span>
|
||||
<span class="n">result</span> <span class="o">=</span> <span class="n">c</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="n">b</span><span class="p">,</span> <span class="n">aa</span> <span class="o">=</span> <span class="n">G</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
|
||||
<span class="n">result</span> <span class="o">=</span> <span class="n">F</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">H</span><span class="p">(</span><span class="n">aa</span><span class="p">))</span> <span class="c1"># b is stored in the stack frame during recursive call to H().</span>
|
||||
<span class="k">return</span> <span class="n">result</span>
|
||||
|
||||
return H
|
||||
<span class="k">return</span> <span class="n">H</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Cf. <a class="reference external" href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.41.125">“Bananas, Lenses, & Barbed
|
||||
@@ -185,7 +185,7 @@ the left so we have a definition for <code class="docutils literal notranslate">
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">hylomorphism</span> <span class="o">==</span> <span class="p">[</span><span class="n">unit</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="n">swoncat</span><span class="p">]</span> <span class="n">dipd</span> <span class="p">[</span><span class="n">dip</span><span class="p">]</span> <span class="n">swoncat</span> <span class="n">genrec</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>define('hylomorphism == [unit [pop] swoncat] dipd [dip] swoncat genrec')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'hylomorphism == [unit [pop] swoncat] dipd [dip] swoncat genrec'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<section id="example-finding-triangular-numbers">
|
||||
@@ -200,17 +200,17 @@ of all positive integers less than that one. (In this case the types
|
||||
<li><p><code class="docutils literal notranslate"><span class="pre">[G]</span></code> is <code class="docutils literal notranslate"><span class="pre">[--</span> <span class="pre">dup]</span></code></p></li>
|
||||
<li><p><code class="docutils literal notranslate"><span class="pre">[F]</span></code> is <code class="docutils literal notranslate"><span class="pre">[+]</span></code></p></li>
|
||||
</ul>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>define('triangular_number == [1 <=] 0 [-- dup] [+] hylomorphism')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'triangular_number == [1 <=] 0 [-- dup] [+] hylomorphism'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Let’s try it:</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('5 triangular_number')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'5 triangular_number'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">10</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[0 1 2 3 4 5 6] [triangular_number] map')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[0 1 2 3 4 5 6] [triangular_number] map'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">3</span> <span class="mi">6</span> <span class="mi">10</span> <span class="mi">15</span><span class="p">]</span>
|
||||
@@ -372,10 +372,10 @@ values.</p>
|
||||
<span class="o">==</span> <span class="p">[</span><span class="mi">0</span> <span class="o"><=</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="p">[]]</span> <span class="p">[</span><span class="o">--</span> <span class="n">dup</span><span class="p">]</span> <span class="p">[</span><span class="n">dip</span> <span class="n">swons</span><span class="p">]</span> <span class="n">genrec</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>define('range == [0 <=] [] [-- dup] [swons] hylomorphism')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'range == [0 <=] [] [-- dup] [swons] hylomorphism'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('5 range')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'5 range'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">4</span> <span class="mi">3</span> <span class="mi">2</span> <span class="mi">1</span> <span class="mi">0</span><span class="p">]</span>
|
||||
@@ -388,10 +388,10 @@ values.</p>
|
||||
<span class="o">==</span> <span class="p">[]</span> <span class="n">swap</span> <span class="p">[</span><span class="mi">0</span> <span class="o"><=</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="p">[</span><span class="o">--</span> <span class="n">dup</span> <span class="p">[</span><span class="n">swons</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">primrec</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>define('range_reverse == [] swap [0 <=] [pop] [-- dup [swons] dip] primrec')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'range_reverse == [] swap [0 <=] [pop] [-- dup [swons] dip] primrec'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('5 range_reverse')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'5 range_reverse'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">0</span> <span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span><span class="p">]</span>
|
||||
@@ -404,10 +404,10 @@ values.</p>
|
||||
<span class="o">==</span> <span class="p">[</span><span class="mi">0</span> <span class="o"><=</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="p">[]]</span> <span class="p">[[</span><span class="o">--</span><span class="p">]</span> <span class="n">dupdip</span><span class="p">]</span> <span class="p">[</span><span class="n">dip</span> <span class="n">swons</span><span class="p">]</span> <span class="n">genrec</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>define('ranger == [0 <=] [pop []] [[--] dupdip] [dip swons] genrec')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'ranger == [0 <=] [pop []] [[--] dupdip] [dip swons] genrec'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('5 ranger')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'5 ranger'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">5</span> <span class="mi">4</span> <span class="mi">3</span> <span class="mi">2</span> <span class="mi">1</span><span class="p">]</span>
|
||||
@@ -420,10 +420,10 @@ values.</p>
|
||||
<span class="o">==</span> <span class="p">[]</span> <span class="n">swap</span> <span class="p">[</span><span class="mi">0</span> <span class="o"><=</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="p">[[</span><span class="n">swons</span><span class="p">]</span> <span class="n">dupdip</span> <span class="o">--</span><span class="p">]</span> <span class="n">primrec</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>define('ranger_reverse == [] swap [0 <=] [pop] [[swons] dupdip --] primrec')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'ranger_reverse == [] swap [0 <=] [pop] [[swons] dupdip --] primrec'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('5 ranger_reverse')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'5 ranger_reverse'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span> <span class="mi">5</span><span class="p">]</span>
|
||||
@@ -444,17 +444,17 @@ and makes some new value.</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">C</span> <span class="o">==</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="n">c</span> <span class="p">[</span><span class="n">uncons</span> <span class="n">swap</span><span class="p">]</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="n">hylomorphism</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>define('swuncons == uncons swap') # Awkward name.
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'swuncons == uncons swap'</span><span class="p">)</span> <span class="c1"># Awkward name.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>An example of a catamorphism is the sum function.</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="nb">sum</span> <span class="o">==</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="mi">0</span> <span class="p">[</span><span class="n">swuncons</span><span class="p">]</span> <span class="p">[</span><span class="o">+</span><span class="p">]</span> <span class="n">hylomorphism</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>define('sum == [not] 0 [swuncons] [+] hylomorphism')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'sum == [not] 0 [swuncons] [+] hylomorphism'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[5 4 3 2 1] sum')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[5 4 3 2 1] sum'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">15</span>
|
||||
@@ -464,7 +464,7 @@ and makes some new value.</p>
|
||||
<h3>The <code class="docutils literal notranslate"><span class="pre">step</span></code> combinator<a class="headerlink" href="#the-step-combinator" title="Permalink to this headline">¶</a></h3>
|
||||
<p>The <code class="docutils literal notranslate"><span class="pre">step</span></code> combinator will usually be better to use than
|
||||
<code class="docutils literal notranslate"><span class="pre">catamorphism</span></code>.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[step] help')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[step] help'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Run</span> <span class="n">a</span> <span class="n">quoted</span> <span class="n">program</span> <span class="n">on</span> <span class="n">each</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">a</span> <span class="n">sequence</span><span class="o">.</span>
|
||||
@@ -488,10 +488,10 @@ and makes some new value.</p>
|
||||
<span class="n">on</span> <span class="n">top</span> <span class="n">of</span> <span class="n">the</span> <span class="n">stack</span><span class="o">.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>define('sum == 0 swap [+] step')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'sum == 0 swap [+] step'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[5 4 3 2 1] sum')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[5 4 3 2 1] sum'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">15</span>
|
||||
@@ -512,10 +512,10 @@ and makes some new value.</p>
|
||||
<span class="n">P</span> <span class="o">==</span> <span class="mi">1</span> <span class="o"><=</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>define('factorial == 1 swap [1 <=] [pop] [[*] dupdip --] primrec')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'factorial == 1 swap [1 <=] [pop] [[*] dupdip --] primrec'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('5 factorial')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'5 factorial'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">120</span>
|
||||
@@ -544,10 +544,10 @@ pattern <code class="docutils literal notranslate"><span class="pre">H2</span></
|
||||
<span class="n">P</span> <span class="o">==</span> <span class="ow">not</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>define('tails == [] swap [not] [pop] [rest dup [swons] dip] primrec')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'tails == [] swap [not] [pop] [rest dup [swons] dip] primrec'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1 2 3] tails')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 2 3] tails'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[[]</span> <span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">3</span><span class="p">]]</span>
|
||||
|
||||
@@ -42,12 +42,12 @@ we can implement e.g. a function that adds new functions to the
|
||||
dictionary. However, there’s no function that does that. Adding a new
|
||||
function to the dictionary is a meta-interpreter action, you have to do
|
||||
it in Python, not Joy.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>from notebook_preamble import D, J, V
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="kn">import</span> <span class="n">D</span><span class="p">,</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<section id="a-long-trace">
|
||||
<h2>A long trace<a class="headerlink" href="#a-long-trace" title="Permalink to this headline">¶</a></h2>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>V('[23 18] average')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'[23 18] average'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="p">[</span><span class="mi">23</span> <span class="mi">18</span><span class="p">]</span> <span class="n">average</span>
|
||||
@@ -105,30 +105,30 @@ it in Python, not Joy.</p>
|
||||
<p>An efficient <code class="docutils literal notranslate"><span class="pre">sum</span></code> function is already in the library. But for
|
||||
<code class="docutils literal notranslate"><span class="pre">size</span></code> we can use a “compiled” version hand-written in Python to speed
|
||||
up evaluation and make the trace more readable.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>from joy.library import SimpleFunctionWrapper
|
||||
from joy.utils.stack import iter_stack
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">joy.library</span> <span class="kn">import</span> <span class="n">SimpleFunctionWrapper</span>
|
||||
<span class="kn">from</span> <span class="nn">joy.utils.stack</span> <span class="kn">import</span> <span class="n">iter_stack</span>
|
||||
|
||||
|
||||
@SimpleFunctionWrapper
|
||||
def size(stack):
|
||||
'''Return the size of the sequence on the stack.'''
|
||||
sequence, stack = stack
|
||||
n = 0
|
||||
for _ in iter_stack(sequence):
|
||||
n += 1
|
||||
return n, stack
|
||||
<span class="nd">@SimpleFunctionWrapper</span>
|
||||
<span class="k">def</span> <span class="nf">size</span><span class="p">(</span><span class="n">stack</span><span class="p">):</span>
|
||||
<span class="sd">'''Return the size of the sequence on the stack.'''</span>
|
||||
<span class="n">sequence</span><span class="p">,</span> <span class="n">stack</span> <span class="o">=</span> <span class="n">stack</span>
|
||||
<span class="n">n</span> <span class="o">=</span> <span class="mi">0</span>
|
||||
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="n">iter_stack</span><span class="p">(</span><span class="n">sequence</span><span class="p">):</span>
|
||||
<span class="n">n</span> <span class="o">+=</span> <span class="mi">1</span>
|
||||
<span class="k">return</span> <span class="n">n</span><span class="p">,</span> <span class="n">stack</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Now we replace the old version in the dictionary with the new version,
|
||||
and re-evaluate the expression.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>D['size'] = size
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">D</span><span class="p">[</span><span class="s1">'size'</span><span class="p">]</span> <span class="o">=</span> <span class="n">size</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</section>
|
||||
<section id="a-shorter-trace">
|
||||
<h2>A shorter trace<a class="headerlink" href="#a-shorter-trace" title="Permalink to this headline">¶</a></h2>
|
||||
<p>You can see that <code class="docutils literal notranslate"><span class="pre">size</span></code> now executes in a single step.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>V('[23 18] average')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'[23 18] average'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="p">[</span><span class="mi">23</span> <span class="mi">18</span><span class="p">]</span> <span class="n">average</span>
|
||||
|
||||
@@ -148,17 +148,17 @@ the desired outcome.</p>
|
||||
</section>
|
||||
<section id="define-treestep">
|
||||
<h2>Define <code class="docutils literal notranslate"><span class="pre">treestep</span></code><a class="headerlink" href="#define-treestep" title="Permalink to this headline">¶</a></h2>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>from notebook_preamble import D, J, V, define, DefinitionWrapper
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="kn">import</span> <span class="n">D</span><span class="p">,</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span><span class="p">,</span> <span class="n">define</span><span class="p">,</span> <span class="n">DefinitionWrapper</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>DefinitionWrapper.add_definitions('''
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">DefinitionWrapper</span><span class="o">.</span><span class="n">add_definitions</span><span class="p">(</span><span class="s1">'''</span>
|
||||
|
||||
_treestep_0 == [[not] swap] dip
|
||||
_treestep_1 == [dip] cons [uncons] swoncat
|
||||
treegrind == [_treestep_1 _treestep_0] dip genrec
|
||||
treestep == [map] swoncat treegrind
|
||||
<span class="s1"> _treestep_0 == [[not] swap] dip</span>
|
||||
<span class="s1"> _treestep_1 == [dip] cons [uncons] swoncat</span>
|
||||
<span class="s1"> treegrind == [_treestep_1 _treestep_0] dip genrec</span>
|
||||
<span class="s1"> treestep == [map] swoncat treegrind</span>
|
||||
|
||||
''', D)
|
||||
<span class="s1">'''</span><span class="p">,</span> <span class="n">D</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -169,7 +169,7 @@ all nodes in a tree with this function:</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sumtree</span> <span class="o">==</span> <span class="p">[</span><span class="n">pop</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[</span><span class="nb">sum</span> <span class="o">+</span><span class="p">]</span> <span class="n">treestep</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>define('sumtree == [pop 0] [] [sum +] treestep')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'sumtree == [pop 0] [] [sum +] treestep'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Running this function on an empty tree value gives zero:</p>
|
||||
@@ -178,7 +178,7 @@ all nodes in a tree with this function:</p>
|
||||
<span class="mi">0</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[] sumtree') # Empty tree.
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[] sumtree'</span><span class="p">)</span> <span class="c1"># Empty tree.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">0</span>
|
||||
@@ -192,61 +192,61 @@ all nodes in a tree with this function:</p>
|
||||
<span class="n">n</span><span class="o">+</span><span class="n">m</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[23] sumtree') # No child trees.
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23] sumtree'</span><span class="p">)</span> <span class="c1"># No child trees.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">23</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[23 []] sumtree') # Child tree, empty.
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23 []] sumtree'</span><span class="p">)</span> <span class="c1"># Child tree, empty.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">23</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[23 [2 [4]] [3]] sumtree') # Non-empty child trees.
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23 [2 [4]] [3]] sumtree'</span><span class="p">)</span> <span class="c1"># Non-empty child trees.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">32</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[23 [2 [8] [9]] [3] [4 []]] sumtree') # Etc...
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23 [2 [8] [9]] [3] [4 []]] sumtree'</span><span class="p">)</span> <span class="c1"># Etc...</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">49</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[23 [2 [8] [9]] [3] [4 []]] [pop 0] [] [cons sum] treestep') # Alternate "spelling".
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23 [2 [8] [9]] [3] [4 []]] [pop 0] [] [cons sum] treestep'</span><span class="p">)</span> <span class="c1"># Alternate "spelling".</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">49</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[23 [2 [8] [9]] [3] [4 []]] [] [pop 23] [cons] treestep') # Replace each node.
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23 [2 [8] [9]] [3] [4 []]] [] [pop 23] [cons] treestep'</span><span class="p">)</span> <span class="c1"># Replace each node.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">23</span> <span class="p">[</span><span class="mi">23</span> <span class="p">[</span><span class="mi">23</span><span class="p">]</span> <span class="p">[</span><span class="mi">23</span><span class="p">]]</span> <span class="p">[</span><span class="mi">23</span><span class="p">]</span> <span class="p">[</span><span class="mi">23</span> <span class="p">[]]]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[23 [2 [8] [9]] [3] [4 []]] [] [pop 1] [cons] treestep')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23 [2 [8] [9]] [3] [4 []]] [] [pop 1] [cons] treestep'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">1</span><span class="p">]]</span> <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">1</span> <span class="p">[]]]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[23 [2 [8] [9]] [3] [4 []]] [] [pop 1] [cons] treestep sumtree')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23 [2 [8] [9]] [3] [4 []]] [] [pop 1] [cons] treestep sumtree'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">6</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[23 [2 [8] [9]] [3] [4 []]] [pop 0] [pop 1] [sum +] treestep') # Combine replace and sum into one function.
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[23 [2 [8] [9]] [3] [4 []]] [pop 0] [pop 1] [sum +] treestep'</span><span class="p">)</span> <span class="c1"># Combine replace and sum into one function.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">6</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[4 [3 [] [7]]] [pop 0] [pop 1] [sum +] treestep') # Combine replace and sum into one function.
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[4 [3 [] [7]]] [pop 0] [pop 1] [sum +] treestep'</span><span class="p">)</span> <span class="c1"># Combine replace and sum into one function.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">3</span>
|
||||
@@ -277,7 +277,7 @@ all nodes in a tree with this function:</p>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>This doesn’t quite work:</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[[3 0] [[2 0] [][]] [[9 0] [[5 0] [[4 0] [][]] [[8 0] [[6 0] [] [[7 0] [][]]][]]][]]] ["B"] [first] [i] treestep')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[[3 0] [[2 0] [][]] [[9 0] [[5 0] [[4 0] [][]] [[8 0] [[6 0] [] [[7 0] [][]]][]]][]]] ["B"] [first] [i] treestep'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">3</span> <span class="s1">'B'</span> <span class="s1">'B'</span>
|
||||
@@ -299,7 +299,7 @@ depositing our results directly on the stack.</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[]</span> <span class="p">[</span><span class="n">first</span><span class="p">]</span> <span class="p">[</span><span class="n">flatten</span> <span class="n">cons</span><span class="p">]</span> <span class="n">treestep</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [first] [flatten cons] treestep')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [first] [flatten cons] treestep'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">3</span> <span class="mi">2</span> <span class="mi">9</span> <span class="mi">5</span> <span class="mi">4</span> <span class="mi">8</span> <span class="mi">6</span> <span class="mi">7</span><span class="p">]</span>
|
||||
@@ -322,7 +322,7 @@ depositing our results directly on the stack.</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[]</span> <span class="p">[</span><span class="n">i</span> <span class="n">roll</span><span class="o"><</span> <span class="n">swons</span> <span class="n">concat</span><span class="p">]</span> <span class="p">[</span><span class="n">first</span><span class="p">]</span> <span class="n">treestep</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [uncons pop] [i roll< swons concat] treestep')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [uncons pop] [i roll< swons concat] treestep'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span> <span class="mi">5</span> <span class="mi">6</span> <span class="mi">7</span> <span class="mi">8</span> <span class="mi">9</span><span class="p">]</span>
|
||||
@@ -343,7 +343,7 @@ non-empty node is:</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key</span> <span class="n">value</span><span class="p">]</span> <span class="n">N</span> <span class="p">[</span><span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">K</span><span class="p">]</span> <span class="n">C</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[["key" "value"] ["left"] ["right"] ] ["B"] ["N"] ["C"] treegrind')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[["key" "value"] ["left"] ["right"] ] ["B"] ["N"] ["C"] treegrind'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'key'</span> <span class="s1">'value'</span><span class="p">]</span> <span class="s1">'N'</span> <span class="p">[[</span><span class="s1">'left'</span><span class="p">]</span> <span class="p">[</span><span class="s1">'right'</span><span class="p">]]</span> <span class="p">[[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="s1">'B'</span><span class="p">]</span> <span class="p">[</span><span class="n">uncons</span> <span class="p">[</span><span class="s1">'N'</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="p">[</span><span class="s1">'C'</span><span class="p">]</span> <span class="n">genrec</span><span class="p">]</span> <span class="s1">'C'</span>
|
||||
@@ -353,21 +353,21 @@ non-empty node is:</p>
|
||||
<section id="treegrind-with-step">
|
||||
<h2><code class="docutils literal notranslate"><span class="pre">treegrind</span></code> with <code class="docutils literal notranslate"><span class="pre">step</span></code><a class="headerlink" href="#treegrind-with-step" title="Permalink to this headline">¶</a></h2>
|
||||
<p>Iteration through the nodes</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [pop] ["N"] [step] treegrind')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [pop] ["N"] [step] treegrind'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">3</span> <span class="mi">0</span><span class="p">]</span> <span class="s1">'N'</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">0</span><span class="p">]</span> <span class="s1">'N'</span> <span class="p">[</span><span class="mi">9</span> <span class="mi">0</span><span class="p">]</span> <span class="s1">'N'</span> <span class="p">[</span><span class="mi">5</span> <span class="mi">0</span><span class="p">]</span> <span class="s1">'N'</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">0</span><span class="p">]</span> <span class="s1">'N'</span> <span class="p">[</span><span class="mi">8</span> <span class="mi">0</span><span class="p">]</span> <span class="s1">'N'</span> <span class="p">[</span><span class="mi">6</span> <span class="mi">0</span><span class="p">]</span> <span class="s1">'N'</span> <span class="p">[</span><span class="mi">7</span> <span class="mi">0</span><span class="p">]</span> <span class="s1">'N'</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Sum the nodes’ keys.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('0 [[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [pop] [first +] [step] treegrind')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'0 [[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [pop] [first +] [step] treegrind'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">44</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Rebuild the tree using <code class="docutils literal notranslate"><span class="pre">map</span></code> (imitating <code class="docutils literal notranslate"><span class="pre">treestep</span></code>.)</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [[100 +] infra] [map cons] treegrind')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [[100 +] infra] [map cons] treegrind'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[[</span><span class="mi">103</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[[</span><span class="mi">102</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[[</span><span class="mi">109</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[[</span><span class="mi">105</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[[</span><span class="mi">104</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[[</span><span class="mi">108</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[[</span><span class="mi">106</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[[</span><span class="mi">107</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[]]]</span> <span class="p">[]]]</span> <span class="p">[]]]</span>
|
||||
@@ -449,37 +449,37 @@ equal):</p>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>To me, that seems simpler than the <code class="docutils literal notranslate"><span class="pre">genrec</span></code> version.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>DefinitionWrapper.add_definitions('''
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">DefinitionWrapper</span><span class="o">.</span><span class="n">add_definitions</span><span class="p">(</span><span class="s1">'''</span>
|
||||
|
||||
T> == pop [first] dip i
|
||||
T< == pop [second] dip i
|
||||
E == roll> popop first
|
||||
P == roll< [roll< uncons swap] dip
|
||||
<span class="s1"> T> == pop [first] dip i</span>
|
||||
<span class="s1"> T< == pop [second] dip i</span>
|
||||
<span class="s1"> E == roll> popop first</span>
|
||||
<span class="s1"> P == roll< [roll< uncons swap] dip</span>
|
||||
|
||||
Tree-get == [P [T>] [E] [T<] cmp] treegrind
|
||||
<span class="s1"> Tree-get == [P [T>] [E] [T<] cmp] treegrind</span>
|
||||
|
||||
''', D)
|
||||
<span class="s1">'''</span><span class="p">,</span> <span class="n">D</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('''\
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'''</span><span class="se">\</span>
|
||||
|
||||
[[3 13] [[2 12] [] []] [[9 19] [[5 15] [[4 14] [] []] [[8 18] [[6 16] [] [[7 17] [] []]] []]] []]]
|
||||
<span class="s1">[[3 13] [[2 12] [] []] [[9 19] [[5 15] [[4 14] [] []] [[8 18] [[6 16] [] [[7 17] [] []]] []]] []]]</span>
|
||||
|
||||
[] [5] Tree-get
|
||||
<span class="s1">[] [5] Tree-get</span>
|
||||
|
||||
''')
|
||||
<span class="s1">'''</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">15</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('''\
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'''</span><span class="se">\</span>
|
||||
|
||||
[[3 13] [[2 12] [] []] [[9 19] [[5 15] [[4 14] [] []] [[8 18] [[6 16] [] [[7 17] [] []]] []]] []]]
|
||||
<span class="s1">[[3 13] [[2 12] [] []] [[9 19] [[5 15] [[4 14] [] []] [[8 18] [[6 16] [] [[7 17] [] []]] []]] []]]</span>
|
||||
|
||||
[pop "nope"] [25] Tree-get
|
||||
<span class="s1">[pop "nope"] [25] Tree-get</span>
|
||||
|
||||
''')
|
||||
<span class="s1">'''</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">'nope'</span>
|
||||
|
||||
@@ -35,33 +35,33 @@
|
||||
|
||||
<section id="type-checking">
|
||||
<h1>Type Checking<a class="headerlink" href="#type-checking" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>import logging, sys
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">logging</span><span class="o">,</span> <span class="nn">sys</span>
|
||||
|
||||
logging.basicConfig(
|
||||
format='%(message)s',
|
||||
stream=sys.stdout,
|
||||
level=logging.INFO,
|
||||
)
|
||||
<span class="n">logging</span><span class="o">.</span><span class="n">basicConfig</span><span class="p">(</span>
|
||||
<span class="nb">format</span><span class="o">=</span><span class="s1">'</span><span class="si">%(message)s</span><span class="s1">'</span><span class="p">,</span>
|
||||
<span class="n">stream</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="p">,</span>
|
||||
<span class="n">level</span><span class="o">=</span><span class="n">logging</span><span class="o">.</span><span class="n">INFO</span><span class="p">,</span>
|
||||
<span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>from joy.utils.types import (
|
||||
doc_from_stack_effect,
|
||||
infer,
|
||||
reify,
|
||||
unify,
|
||||
FUNCTIONS,
|
||||
JoyTypeError,
|
||||
)
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">joy.utils.types</span> <span class="kn">import</span> <span class="p">(</span>
|
||||
<span class="n">doc_from_stack_effect</span><span class="p">,</span>
|
||||
<span class="n">infer</span><span class="p">,</span>
|
||||
<span class="n">reify</span><span class="p">,</span>
|
||||
<span class="n">unify</span><span class="p">,</span>
|
||||
<span class="n">FUNCTIONS</span><span class="p">,</span>
|
||||
<span class="n">JoyTypeError</span><span class="p">,</span>
|
||||
<span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>D = FUNCTIONS.copy()
|
||||
del D['product']
|
||||
globals().update(D)
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">D</span> <span class="o">=</span> <span class="n">FUNCTIONS</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
||||
<span class="k">del</span> <span class="n">D</span><span class="p">[</span><span class="s1">'product'</span><span class="p">]</span>
|
||||
<span class="nb">globals</span><span class="p">()</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">D</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<section id="an-example">
|
||||
<h2>An Example<a class="headerlink" href="#an-example" title="Permalink to this headline">¶</a></h2>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>fi, fo = infer(pop, swap, rolldown, rrest, ccons)[0]
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">fi</span><span class="p">,</span> <span class="n">fo</span> <span class="o">=</span> <span class="n">infer</span><span class="p">(</span><span class="n">pop</span><span class="p">,</span> <span class="n">swap</span><span class="p">,</span> <span class="n">rolldown</span><span class="p">,</span> <span class="n">rrest</span><span class="p">,</span> <span class="n">ccons</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>25 (--) ∘ pop swap rolldown rrest ccons
|
||||
@@ -72,32 +72,32 @@ globals().update(D)
|
||||
40 ([a4 a5 ...1] a3 a2 a1 -- [a2 a3 ...1]) ∘
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>print doc_from_stack_effect(fi, fo)
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="n">fi</span><span class="p">,</span> <span class="n">fo</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">([</span><span class="n">a4</span> <span class="n">a5</span> <span class="o">...</span><span class="mi">1</span><span class="p">]</span> <span class="n">a3</span> <span class="n">a2</span> <span class="n">a1</span> <span class="o">--</span> <span class="p">[</span><span class="n">a2</span> <span class="n">a3</span> <span class="o">...</span><span class="mi">1</span><span class="p">])</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>from joy.parser import text_to_expression
|
||||
from joy.utils.stack import stack_to_string
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">joy.parser</span> <span class="kn">import</span> <span class="n">text_to_expression</span>
|
||||
<span class="kn">from</span> <span class="nn">joy.utils.stack</span> <span class="kn">import</span> <span class="n">stack_to_string</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>e = text_to_expression('0 1 2 [3 4]') # reverse order
|
||||
print stack_to_string(e)
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">e</span> <span class="o">=</span> <span class="n">text_to_expression</span><span class="p">(</span><span class="s1">'0 1 2 [3 4]'</span><span class="p">)</span> <span class="c1"># reverse order</span>
|
||||
<span class="nb">print</span> <span class="n">stack_to_string</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">3</span> <span class="mi">4</span><span class="p">]</span> <span class="mi">2</span> <span class="mi">1</span> <span class="mi">0</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>u = unify(e, fi)[0]
|
||||
u
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">u</span> <span class="o">=</span> <span class="n">unify</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">fi</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
||||
<span class="n">u</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">{</span><span class="n">a1</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">a2</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="n">a3</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="n">a4</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="n">a5</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span> <span class="n">s2</span><span class="p">:</span> <span class="p">(),</span> <span class="n">s1</span><span class="p">:</span> <span class="p">()}</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>g = reify(u, (fi, fo))
|
||||
print doc_from_stack_effect(*g)
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">g</span> <span class="o">=</span> <span class="n">reify</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="p">(</span><span class="n">fi</span><span class="p">,</span> <span class="n">fo</span><span class="p">))</span>
|
||||
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">g</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="o">...</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="p">]</span> <span class="mi">2</span> <span class="mi">1</span> <span class="mi">0</span> <span class="o">--</span> <span class="o">...</span> <span class="p">[</span><span class="mi">1</span> <span class="mi">2</span> <span class="p">])</span>
|
||||
@@ -106,18 +106,18 @@ print doc_from_stack_effect(*g)
|
||||
</section>
|
||||
<section id="unification-works-in-reverse">
|
||||
<h2>Unification Works “in Reverse”<a class="headerlink" href="#unification-works-in-reverse" title="Permalink to this headline">¶</a></h2>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>e = text_to_expression('[2 3]')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">e</span> <span class="o">=</span> <span class="n">text_to_expression</span><span class="p">(</span><span class="s1">'[2 3]'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>u = unify(e, fo)[0] # output side, not input side
|
||||
u
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">u</span> <span class="o">=</span> <span class="n">unify</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">fo</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="c1"># output side, not input side</span>
|
||||
<span class="n">u</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">{</span><span class="n">a2</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="n">a3</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="n">s2</span><span class="p">:</span> <span class="p">(),</span> <span class="n">s1</span><span class="p">:</span> <span class="p">()}</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>g = reify(u, (fi, fo))
|
||||
print doc_from_stack_effect(*g)
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">g</span> <span class="o">=</span> <span class="n">reify</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="p">(</span><span class="n">fi</span><span class="p">,</span> <span class="n">fo</span><span class="p">))</span>
|
||||
<span class="nb">print</span> <span class="n">doc_from_stack_effect</span><span class="p">(</span><span class="o">*</span><span class="n">g</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="o">...</span> <span class="p">[</span><span class="n">a4</span> <span class="n">a5</span> <span class="p">]</span> <span class="mi">3</span> <span class="mi">2</span> <span class="n">a1</span> <span class="o">--</span> <span class="o">...</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">3</span> <span class="p">])</span>
|
||||
@@ -126,7 +126,7 @@ print doc_from_stack_effect(*g)
|
||||
</section>
|
||||
<section id="failing-a-check">
|
||||
<h2>Failing a Check<a class="headerlink" href="#failing-a-check" title="Permalink to this headline">¶</a></h2>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>fi, fo = infer(dup, mul)[0]
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">fi</span><span class="p">,</span> <span class="n">fo</span> <span class="o">=</span> <span class="n">infer</span><span class="p">(</span><span class="n">dup</span><span class="p">,</span> <span class="n">mul</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>25 (--) ∘ dup mul
|
||||
@@ -135,17 +135,17 @@ print doc_from_stack_effect(*g)
|
||||
31 (i1 -- i2) ∘
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>e = text_to_expression('"two"')
|
||||
print stack_to_string(e)
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">e</span> <span class="o">=</span> <span class="n">text_to_expression</span><span class="p">(</span><span class="s1">'"two"'</span><span class="p">)</span>
|
||||
<span class="nb">print</span> <span class="n">stack_to_string</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">'two'</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>try:
|
||||
unify(e, fi)
|
||||
except JoyTypeError, err:
|
||||
print err
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">try</span><span class="p">:</span>
|
||||
<span class="n">unify</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">fi</span><span class="p">)</span>
|
||||
<span class="k">except</span> <span class="n">JoyTypeError</span><span class="p">,</span> <span class="n">err</span><span class="p">:</span>
|
||||
<span class="nb">print</span> <span class="n">err</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Cannot</span> <span class="n">unify</span> <span class="s1">'two'</span> <span class="ow">and</span> <span class="n">f1</span><span class="o">.</span>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -42,7 +42,7 @@ the original paper: <a class="reference external" href="https://www.st.cs.uni-sa
|
||||
Huet</a></p>
|
||||
<p>Given a datastructure on the stack we can navigate through it, modify
|
||||
it, and rebuild it using the “zipper” technique.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>from notebook_preamble import J, V, define
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="kn">import</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span><span class="p">,</span> <span class="n">define</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<section id="trees">
|
||||
@@ -52,7 +52,7 @@ strings, Symbols (strings that are names of functions) and sequences
|
||||
(aka lists, aka quoted literals, aka aggregates, etc…), but we can build
|
||||
<a class="reference external" href="https://en.wikipedia.org/wiki/Tree_%28data_structure%29">trees</a> out
|
||||
of sequences.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1 [2 [3 4 25 6] 7] 8]')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 [2 [3 4 25 6] 7] 8]'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span>
|
||||
@@ -75,13 +75,13 @@ datastructure used to keep track of these items is the zipper.)</p>
|
||||
show the trace so you can see how it works. If we were going to use
|
||||
these a lot it would make sense to write Python versions for efficiency,
|
||||
but see below.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>define('z-down == [] swap uncons swap')
|
||||
define('z-up == swons swap shunt')
|
||||
define('z-right == [swons] cons dip uncons swap')
|
||||
define('z-left == swons [uncons swap] dip swap')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'z-down == [] swap uncons swap'</span><span class="p">)</span>
|
||||
<span class="n">define</span><span class="p">(</span><span class="s1">'z-up == swons swap shunt'</span><span class="p">)</span>
|
||||
<span class="n">define</span><span class="p">(</span><span class="s1">'z-right == [swons] cons dip uncons swap'</span><span class="p">)</span>
|
||||
<span class="n">define</span><span class="p">(</span><span class="s1">'z-left == swons [uncons swap] dip swap'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>V('[1 [2 [3 4 25 6] 7] 8] z-down')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'[1 [2 [3 4 25 6] 7] 8] z-down'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="n">z</span><span class="o">-</span><span class="n">down</span>
|
||||
@@ -93,7 +93,7 @@ define('z-left == swons [uncons swap] dip swap')
|
||||
<span class="p">[]</span> <span class="p">[[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="mi">1</span> <span class="o">.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>V('[] [[2 [3 4 25 6] 7] 8] 1 z-right')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'[] [[2 [3 4 25 6] 7] 8] 1 z-right'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="p">[]</span> <span class="p">[[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="mi">1</span> <span class="n">z</span><span class="o">-</span><span class="n">right</span>
|
||||
@@ -113,43 +113,43 @@ define('z-left == swons [uncons swap] dip swap')
|
||||
<span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="o">.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1] [8] [2 [3 4 25 6] 7] z-down')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1] [8] [2 [3 4 25 6] 7] z-down'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">2</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1] [8] [] [[3 4 25 6] 7] 2 z-right')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1] [8] [] [[3 4 25 6] 7] 2 z-right'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1] [8] [2] [7] [3 4 25 6] z-down')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1] [8] [2] [7] [3 4 25 6] z-down'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">3</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1] [8] [2] [7] [] [4 25 6] 3 z-right')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1] [8] [2] [7] [] [4 25 6] 3 z-right'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">4</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1] [8] [2] [7] [3] [25 6] 4 z-right')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1] [8] [2] [7] [3] [25 6] 4 z-right'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="mi">25</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1] [8] [2] [7] [4 3] [6] 25 sqr')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1] [8] [2] [7] [4 3] [6] 25 sqr'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="mi">625</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>V('[1] [8] [2] [7] [4 3] [6] 625 z-up')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'[1] [8] [2] [7] [4 3] [6] 625 z-up'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="mi">625</span> <span class="n">z</span><span class="o">-</span><span class="n">up</span>
|
||||
@@ -168,13 +168,13 @@ define('z-left == swons [uncons swap] dip swap')
|
||||
<span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">625</span> <span class="mi">6</span><span class="p">]</span> <span class="o">.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1] [8] [2] [7] [3 4 625 6] z-up')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1] [8] [2] [7] [3 4 625 6] z-up'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">625</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1] [8] [2 [3 4 625 6] 7] z-up')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1] [8] [2 [3 4 625 6] 7] z-up'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">625</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span>
|
||||
@@ -185,7 +185,7 @@ define('z-left == swons [uncons swap] dip swap')
|
||||
<h2><code class="docutils literal notranslate"><span class="pre">dip</span></code> and <code class="docutils literal notranslate"><span class="pre">infra</span></code><a class="headerlink" href="#dip-and-infra" title="Permalink to this headline">¶</a></h2>
|
||||
<p>In Joy we have the <code class="docutils literal notranslate"><span class="pre">dip</span></code> and <code class="docutils literal notranslate"><span class="pre">infra</span></code> combinators which can “target”
|
||||
or “address” any particular item in a Joy tree structure.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>V('[1 [2 [3 4 25 6] 7] 8] [[[[[[sqr] dipd] infra] dip] infra] dip] infra')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'[1 [2 [3 4 25 6] 7] 8] [[[[[[sqr] dipd] infra] dip] infra] dip] infra'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="p">[[[[[[</span><span class="n">sqr</span><span class="p">]</span> <span class="n">dipd</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">infra</span>
|
||||
@@ -236,11 +236,11 @@ been embedded in a nested series of quoted programs, e.g.:</p>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>The <code class="docutils literal notranslate"><span class="pre">Z</span></code> function isn’t hard to make.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>define('Z == [[] cons cons] step i')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">'Z == [[] cons cons] step i'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Here it is in action in a simplified scenario.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>V('1 [2 3 4] Z')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'1 [2 3 4] Z'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span><span class="p">]</span> <span class="n">Z</span>
|
||||
@@ -273,7 +273,7 @@ been embedded in a nested series of quoted programs, e.g.:</p>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>And here it is doing the main thing.</p>
|
||||
<div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span>J('[1 [2 [3 4 25 6] 7] 8] [sqr] [dip dip infra dip infra dip infra] Z')
|
||||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">'[1 [2 [3 4 25 6] 7] 8] [sqr] [dip dip infra dip infra dip infra] Z'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">625</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span>
|
||||
|
||||
Reference in New Issue
Block a user