From eb739024eb5e971a91c0bc51b229f7f552d8b432 Mon Sep 17 00:00:00 2001 From: Simon Forman Date: Tue, 26 Jun 2018 15:23:51 -0700 Subject: [PATCH] Type checking, initial work. --- docs/Types.html | 571 ++++++++--- docs/Types.ipynb | 1013 ++++++++++++++----- docs/Types.md | 246 ++++- docs/Types.rst | 243 ++++- docs/sphinx_docs/_build/html/searchindex.js | 2 +- docs/sphinx_docs/notebooks/Types.rst | 243 ++++- joy/utils/polytypes.py | 98 +- joy/utils/types.py | 7 +- test/test_type_inference.py | 33 +- 9 files changed, 1885 insertions(+), 571 deletions(-) diff --git a/docs/Types.html b/docs/Types.html index ad4e69a..e7bf01a 100644 --- a/docs/Types.html +++ b/docs/Types.html @@ -11976,7 +11976,7 @@ w/ {
def poswrd(s, e, d):
-    return roll_down(*swap(*pop(s, e, d)))
+    return rolldown(*swap(*pop(s, e, d)))
 
@@ -13430,9 +13430,9 @@ cons ( 1 [...] -- [1 ...] )
def defs():
 
-    roll_down = (1, 2, 3), (2, 3, 1)
+    rolldown = (1, 2, 3), (2, 3, 1)
 
-    roll_up = (1, 2, 3), (3, 1, 2)
+    rollup = (1, 2, 3), (3, 1, 2)
 
     pop = (1,), ()
 
@@ -13500,13 +13500,13 @@ def rest(stack):
     return (a1, stack)
 
 
-def roll_down(stack):
+def rolldown(stack):
     """(1 2 3 -- 2 3 1)"""
     (a2, (a1, (a0, stack))) = stack
     return (a0, (a2, (a1, stack)))
 
 
-def roll_up(stack):
+def rollup(stack):
     """(1 2 3 -- 3 1 2)"""
     (a2, (a1, (a0, stack))) = stack
     return (a1, (a0, (a2, stack)))
@@ -14099,9 +14099,9 @@ i0 >= f0 -> False
     
def defs():
 
-    roll_down = (A[1], A[2], A[3]), (A[2], A[3], A[1])
+    rolldown = (A[1], A[2], A[3]), (A[2], A[3], A[1])
 
-    roll_up = (A[1], A[2], A[3]), (A[3], A[1], A[2])
+    rollup = (A[1], A[2], A[3]), (A[3], A[1], A[2])
 
     pop = (A[1],), ()
 
@@ -14206,8 +14206,8 @@ popdd = (a3 a2 a1 -- a2 a1)
 popop = (a2 a1 --)
 pred = (n1 -- n2)
 rest = ([a1 .1.] -- [.1.])
-roll_down = (a1 a2 a3 -- a2 a3 a1)
-roll_up = (a1 a2 a3 -- a3 a1 a2)
+rolldown = (a1 a2 a3 -- a2 a3 a1)
+rollup = (a1 a2 a3 -- a3 a1 a2)
 rrest = ([a0 a1 .0.] -- [.0.])
 second = ([a0 a1 .0.] -- a1)
 sqrt = (n0 -- n1)
@@ -14293,7 +14293,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
In [53]:
-
F = reduce(C, (pop, swap, roll_down, rest, rest, cons, cons))
+
F = reduce(C, (pop, swap, rolldown, rest, rest, cons, cons))
 F
 
@@ -14382,7 +14382,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
# e.g. [swap] dip
-neato(roll_up, swap, roll_down)
+neato(rollup, swap, rolldown)
 
@@ -14414,7 +14414,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
# e.g. [popop] dipd
-neato(popdd, roll_down, pop)
+neato(popdd, rolldown, pop)
 
@@ -14446,7 +14446,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
# Reverse the order of the top three items.
-neato(roll_up, swap)
+neato(rollup, swap)
 
@@ -14653,8 +14653,8 @@ popd = (a2 a1 -- a1) popdd = (a3 a2 a1 -- a2 a1) popop = (a2 a1 --) rest = ([a1 .1.] -- [.1.]) -roll_down = (a1 a2 a3 -- a2 a3 a1) -roll_up = (a1 a2 a3 -- a3 a1 a2) +rolldown = (a1 a2 a3 -- a2 a3 a1) +rollup = (a1 a2 a3 -- a3 a1 a2) rrest = ([a0 a1 .0.] -- [.0.]) second = ([a0 a1 .0.] -- a1) swap = (a1 a2 -- a2 a1) @@ -14812,7 +14812,8 @@ uncons = ((a, Z), S) -- (Z, (a, S))
name: (sequence_to_stack(i), sequence_to_stack(o)) for name, (i, o) in DEFS.iteritems() } - +NEW_DEFS['stack'] = S[0], (S[0], S[0]) +NEW_DEFS['swaack'] = (S[1], S[0]), (S[0], S[1]) globals().update(NEW_DEFS)
@@ -14824,19 +14825,6 @@ uncons = ((a, Z), S) -- (Z, (a, S))
In [66]:
-
-
-
stack = S[0], (S[0], S[0])
-
- -
-
-
- -
-
-
-
In [67]:
C(stack, uncons)
@@ -14852,7 +14840,7 @@ uncons = ((a, Z), S) -- (Z, (a, S))
-
Out[67]:
+
Out[66]:
@@ -14869,7 +14857,7 @@ uncons = ((a, Z), S) -- (Z, (a, S))
-
In [68]:
+
In [67]:
C(C(stack, uncons), uncons)
@@ -14885,7 +14873,7 @@ uncons = ((a, Z), S) -- (Z, (a, S))
-
Out[68]:
+
Out[67]:
@@ -14920,7 +14908,7 @@ uncons = ((a, Z), S) -- (Z, (a, S))
-
In [69]:
+
In [68]:
def doc_from_stack_effect(inputs, outputs):
@@ -14977,7 +14965,7 @@ uncons = ((a, Z), S) -- (Z, (a, S))
-
In [70]:
+
In [69]:
for name, stack_effect_comment in sorted(NEW_DEFS.items()):
@@ -15013,12 +15001,14 @@ popdd = (a3 a2 a1 -- a2 a1)
 popop = (a2 a1 --)
 pred = (n1 -- n2)
 rest = ([a1 .1.] -- [.1.])
-roll_down = (a1 a2 a3 -- a2 a3 a1)
-roll_up = (a1 a2 a3 -- a3 a1 a2)
+rolldown = (a1 a2 a3 -- a2 a3 a1)
+rollup = (a1 a2 a3 -- a3 a1 a2)
 rrest = ([a0 a1 .0.] -- [.0.])
 second = ([a0 a1 .0.] -- a1)
 sqrt = (n0 -- n1)
+stack = (... -- ... [...])
 succ = (n1 -- n2)
+swaack = ([.1.] -- [.0.])
 swap = (a1 a2 -- a2 a1)
 swons = ([.0.] a0 -- [a0 .0.])
 third = ([a0 a1 a2 .0.] -- a2)
@@ -15034,7 +15024,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [71]:
+
In [70]:
print ; print doc_from_stack_effect(*stack)
@@ -15075,7 +15065,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [72]:
+
In [71]:
print doc_from_stack_effect(*C(ccons, stack))
@@ -15106,7 +15096,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [73]:
+
In [72]:
Q = C(ccons, stack)
@@ -15124,7 +15114,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
 
-
Out[73]:
+
Out[72]:
@@ -15150,7 +15140,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
-
In [74]:
+
In [73]:
def compile_(name, f, doc=None):
@@ -15170,7 +15160,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [75]:
+
In [74]:
print compile_('Q', Q)
@@ -15204,7 +15194,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [76]:
+
In [75]:
unstack = (S[1], S[0]), S[1]
@@ -15218,7 +15208,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [77]:
+
In [76]:
print doc_from_stack_effect(*unstack)
@@ -15249,7 +15239,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [78]:
+
In [77]:
print doc_from_stack_effect(*enstacken)
@@ -15280,7 +15270,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [79]:
+
In [78]:
print doc_from_stack_effect(*C(cons, unstack))
@@ -15311,7 +15301,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [80]:
+
In [79]:
print doc_from_stack_effect(*C(cons, enstacken))
@@ -15342,7 +15332,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [81]:
+
In [80]:
C(cons, unstack)
@@ -15358,7 +15348,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
 
-
Out[81]:
+
Out[80]:
@@ -15384,7 +15374,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
-
In [82]:
+
In [81]:
class IntJoyType(NumberJoyType): prefix = 'i'
@@ -15401,7 +15391,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [83]:
+
In [82]:
muls = [
@@ -15419,7 +15409,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [84]:
+
In [83]:
for f in muls:
@@ -15454,7 +15444,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [85]:
+
In [84]:
for f in muls:
@@ -15491,7 +15481,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [86]:
+
In [85]:
from itertools import product
@@ -15516,7 +15506,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [87]:
+
In [86]:
for f in MC([dup], muls):
@@ -15549,7 +15539,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [88]:
+
In [87]:
for f in MC([dup], [mul]):
@@ -15659,7 +15649,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [89]:
+
In [88]:
class KleeneStar(object):
@@ -15722,7 +15712,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [90]:
+
In [89]:
def unify(u, v, s=None):
@@ -15803,7 +15793,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [91]:
+
In [90]:
a = (As[1], S[1])
@@ -15818,6 +15808,40 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
+
+ +
Out[90]:
+ + + + +
+
(a1*, s1)
+
+ +
+ +
+
+ +
+
+
+
In [91]:
+
+
+
b = (A[1], S[2])
+b
+
+ +
+
+
+ +
+
+ +
Out[91]:
@@ -15825,40 +15849,6 @@ uncons = ([a1 .1.] -- a1 [.1.]) -
-
(a1*, s1)
-
- -
- -
-
- -
-
-
-
In [92]:
-
-
-
b = (A[1], S[2])
-b
-
- -
-
-
- -
-
- - -
- -
Out[92]:
- - - -
(a1, s2)
@@ -15871,7 +15861,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
-
In [93]:
+
In [92]:
for result in unify(b, a):
@@ -15904,7 +15894,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [94]:
+
In [93]:
for result in unify(a, b):
@@ -15951,7 +15941,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [95]:
+
In [94]:
sum_ = ((Ns[1], S[1]), S[0]), (N[0], S[0])
@@ -15984,7 +15974,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [96]:
+
In [95]:
f = (N[1], (N[2], (N[3], S[1]))), S[0]
@@ -16017,7 +16007,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [97]:
+
In [96]:
for result in unify(sum_[0], f):
@@ -16061,7 +16051,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [98]:
+
In [97]:
def compose(f, g):
@@ -16080,7 +16070,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [99]:
+
In [98]:
def meta_compose(F, G):
@@ -16105,7 +16095,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [100]:
+
In [99]:
for f in MC([dup], muls):
@@ -16138,7 +16128,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [101]:
+
In [100]:
for f in MC([dup], [sum_]):
@@ -16170,7 +16160,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [102]:
+
In [101]:
for f in MC([cons], [sum_]):
@@ -16203,7 +16193,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [103]:
+
In [102]:
sum_ = (((N[1], (Ns[1], S[1])), S[0]), (N[0], S[0]))
@@ -16239,7 +16229,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [104]:
+
In [103]:
a = (A[4], (As[1], (A[3], S[1])))
@@ -16254,6 +16244,40 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
+
+ +
Out[103]:
+ + + + +
+
(a4, (a1*, (a3, s1)))
+
+ +
+ +
+
+ +
+
+
+
In [104]:
+
+
+
b = (A[1], (A[2], S[2]))
+b
+
+ +
+
+
+ +
+
+ +
Out[104]:
@@ -16261,40 +16285,6 @@ uncons = ([a1 .1.] -- a1 [.1.]) -
-
(a4, (a1*, (a3, s1)))
-
- -
- -
-
- -
-
-
-
In [105]:
-
-
-
b = (A[1], (A[2], S[2]))
-b
-
- -
-
-
- -
-
- - -
- -
Out[105]:
- - - -
(a1, (a2, s2))
@@ -16307,7 +16297,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
-
In [106]:
+
In [105]:
for result in unify(b, a):
@@ -16340,7 +16330,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [107]:
+
In [106]:
for result in unify(a, b):
@@ -16410,17 +16400,74 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-

I think there's a way forward. If we convert our list of terms we are composing into a stack structure we can use it as a Joy expression, then we can treat the output half of a function's stack effect comment as a Joy interpreter stack, and just execute combinators directly. We can hybridize the compostition function with an interpreter to evaluate combinators, compose non-combinator functions, and put type variables on the stack. For combinators like branch that can have more than one stack effect we have to "split universes" again and return both. (Note: bug! If one branch doesn't type check the currect code ignores it, so you can think things are okay but have a type error waiting in the faled branch, I think... D'oh! FIXME!!!)

+

I think there's a way forward. If we convert our list of terms we are composing into a stack structure we can use it as a Joy expression, then we can treat the output half of a function's stack effect comment as a Joy interpreter stack, and just execute combinators directly. We can hybridize the compostition function with an interpreter to evaluate combinators, compose non-combinator functions, and put type variables on the stack. For combinators like branch that can have more than one stack effect we have to "split universes" again and return both.

+
+
+
+
In [107]:
+
+
+
class FunctionJoyType(AnyJoyType):
+
+    def __init__(self, name, sec, number):
+        self.name = name
+        self.stack_effects = sec
+        self.number = number
+
+    def __add__(self, other):
+        return self
+    __radd__ = __add__
+
+    def __repr__(self):
+        return self.name
+
+
+class SymbolJoyType(FunctionJoyType): prefix = 'F'
+class CombinatorJoyType(FunctionJoyType): prefix = 'C'
+
+ +
+
+
+
In [108]:
-
stack_concat = lambda q, e: (q[0], stack_concat(q[1], e)) if q else e
+
def flatten(g):
+    return list(chain.from_iterable(g))
+
+
+ID = S[0], S[0]  # Identity function.
+
+
+def infer(e, F=ID):
+    if not e:
+        return [F]
+
+    n, e = e
+
+    if isinstance(n, SymbolJoyType):
+        res = flatten(infer(e, Fn) for Fn in MC([F], n.stack_effects))
+
+    elif isinstance(n, CombinatorJoyType):
+        res = []
+        for combinator in n.stack_effects:
+            fi, fo = F
+            new_fo, ee, _ = combinator(fo, e, {})
+            ee = update(FUNCTIONS, ee)  # Fix Symbols.
+            new_F = fi, new_fo
+            res.extend(infer(ee, new_F))
+    else:
+        lit = s9, (n, s9)
+        res = flatten(infer(e, Fn) for Fn in MC([F], [lit]))
+
+    return res
 
@@ -16431,6 +16478,195 @@ uncons = ([a1 .1.] -- a1 [.1.])
In [109]:
+
+
+
f0, f1, f2, f3, f4, f5, f6, f7, f8, f9 = F = map(FloatJoyType, _R)
+i0, i1, i2, i3, i4, i5, i6, i7, i8, i9 = I = map(IntJoyType, _R)
+n0, n1, n2, n3, n4, n5, n6, n7, n8, n9 = N
+s0, s1, s2, s3, s4, s5, s6, s7, s8, s9 = S
+
+ +
+
+
+ +
+
+
+
In [110]:
+
+
+
import joy.library
+
+FNs = '''ccons cons divmod_ dup dupd first
+         over pm pop popd popdd popop pred
+         rest rolldown rollup rrest second
+         sqrt stack succ swaack swap swons
+         third tuck uncons'''
+
+FUNCTIONS = {
+    name: SymbolJoyType(name, [NEW_DEFS[name]], i)
+    for i, name in enumerate(FNs.strip().split())
+    }
+FUNCTIONS['sum'] = SymbolJoyType('sum', [(((Ns[1], s1), s0), (n0, s0))], 100)
+FUNCTIONS['mul'] = SymbolJoyType('mul', [
+     ((i2, (i1, s0)), (i3, s0)),
+     ((f2, (i1, s0)), (f3, s0)),
+     ((i2, (f1, s0)), (f3, s0)),
+     ((f2, (f1, s0)), (f3, s0)),
+], 101)
+FUNCTIONS.update({
+    combo.__name__: CombinatorJoyType(combo.__name__, [combo], i)
+    for i, combo in enumerate((
+        joy.library.i,
+        joy.library.dip,
+        joy.library.dipd,
+        joy.library.dipdd,
+        joy.library.dupdip,
+        joy.library.b,
+        joy.library.x,
+        joy.library.infra,
+        ))
+    })
+
+def branch_true(stack, expression, dictionary):
+    (then, (else_, (flag, stack))) = stack
+    return stack, CONCAT(then, expression), dictionary
+
+def branch_false(stack, expression, dictionary):
+    (then, (else_, (flag, stack))) = stack
+    return stack, CONCAT(else_, expression), dictionary
+
+FUNCTIONS['branch'] = CombinatorJoyType('branch', [branch_true, branch_false], 100)
+
+ +
+
+
+ +
+
+
+
In [111]:
+
+
+
globals().update(FUNCTIONS)
+
+ +
+
+
+ +
+
+
+
In [112]:
+
+
+
from itertools import chain
+from joy.utils.stack import list_to_stack as l2s
+
+ +
+
+
+ +
+
+
+
In [113]:
+
+
+
expression = l2s([n1, n2, (mul, s2), (stack, s3), dip, infra, first])
+
+ +
+
+
+ +
+
+
+
In [114]:
+
+
+
expression
+
+ +
+
+
+ +
+
+ + +
+ +
Out[114]:
+ + + + +
+
(n1, (n2, ((mul, s2), ((stack, s3), (dip, (infra, (first, ())))))))
+
+ +
+ +
+
+ +
+
+
+
In [120]:
+
+
+
expression = l2s([n1, n2, mul])
+
+ +
+
+
+ +
+
+
+
In [121]:
+
+
+
infer(expression)
+
+ +
+
+
+ +
+
+ + +
+ +
Out[121]:
+ + + + +
+
[]
+
+ +
+ +
+
+ +
+
+
+
In [116]:
class SymbolJoyType(AnyJoyType):
@@ -16489,7 +16725,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [110]:
+
In [117]:
def dip_t(stack, expression):
@@ -16505,7 +16741,7 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [111]:
+
In [118]:
def dip(stack, expression, dictionary):
@@ -16548,10 +16784,10 @@ uncons = ([a1 .1.] -- a1 [.1.])
 
-
In [112]:
+
In [119]:
-
F = reduce(C, (pop, swap, roll_down, rest, rest, cons, cons))
+
F = reduce(C, (pop, swap, rolldown, rest, rest, cons, cons))
 
 print doc_from_stack_effect(*F)
 
@@ -16572,78 +16808,91 @@ uncons = ([a1 .1.] -- a1 [.1.])
 ---------------------------------------------------------------------------
-ValueError                                Traceback (most recent call last)
-<ipython-input-112-4b4cb6ff86e5> in <module>()
-      1 F = reduce(C, (pop, swap, roll_down, rest, rest, cons, cons))
+TypeError                                 Traceback (most recent call last)
+<ipython-input-119-7fde90b4e88f> in <module>()
+      1 F = reduce(C, (pop, swap, rolldown, rest, rest, cons, cons))
       2 
 ----> 3 print doc_from_stack_effect(*F)
 
-<ipython-input-99-ddee30dbb1a6> in C(f, g)
+<ipython-input-98-ddee30dbb1a6> in C(f, g)
      10 def C(f, g):
      11     f, g = relabel(f, g)
 ---> 12     for fg in compose(f, g):
      13         yield delabel(fg)
 
-<ipython-input-98-5eb7ac5ad2c2> in compose(f, g)
+<ipython-input-97-5eb7ac5ad2c2> in compose(f, g)
       1 def compose(f, g):
 ----> 2     (f_in, f_out), (g_in, g_out) = f, g
       3     s = unify(g_in, f_out)
       4     if not s:
       5         raise TypeError('Cannot unify %r and %r.' % (f_out, g_in))
 
-<ipython-input-99-ddee30dbb1a6> in C(f, g)
+<ipython-input-98-ddee30dbb1a6> in C(f, g)
      10 def C(f, g):
      11     f, g = relabel(f, g)
 ---> 12     for fg in compose(f, g):
      13         yield delabel(fg)
 
-<ipython-input-98-5eb7ac5ad2c2> in compose(f, g)
+<ipython-input-97-5eb7ac5ad2c2> in compose(f, g)
       1 def compose(f, g):
 ----> 2     (f_in, f_out), (g_in, g_out) = f, g
       3     s = unify(g_in, f_out)
       4     if not s:
       5         raise TypeError('Cannot unify %r and %r.' % (f_out, g_in))
 
-<ipython-input-99-ddee30dbb1a6> in C(f, g)
+<ipython-input-98-ddee30dbb1a6> in C(f, g)
      10 def C(f, g):
      11     f, g = relabel(f, g)
 ---> 12     for fg in compose(f, g):
      13         yield delabel(fg)
 
-<ipython-input-98-5eb7ac5ad2c2> in compose(f, g)
+<ipython-input-97-5eb7ac5ad2c2> in compose(f, g)
       1 def compose(f, g):
 ----> 2     (f_in, f_out), (g_in, g_out) = f, g
       3     s = unify(g_in, f_out)
       4     if not s:
       5         raise TypeError('Cannot unify %r and %r.' % (f_out, g_in))
 
-<ipython-input-99-ddee30dbb1a6> in C(f, g)
+<ipython-input-98-ddee30dbb1a6> in C(f, g)
      10 def C(f, g):
      11     f, g = relabel(f, g)
 ---> 12     for fg in compose(f, g):
      13         yield delabel(fg)
 
-<ipython-input-98-5eb7ac5ad2c2> in compose(f, g)
+<ipython-input-97-5eb7ac5ad2c2> in compose(f, g)
       1 def compose(f, g):
 ----> 2     (f_in, f_out), (g_in, g_out) = f, g
       3     s = unify(g_in, f_out)
       4     if not s:
       5         raise TypeError('Cannot unify %r and %r.' % (f_out, g_in))
 
-<ipython-input-99-ddee30dbb1a6> in C(f, g)
+<ipython-input-98-ddee30dbb1a6> in C(f, g)
      10 def C(f, g):
      11     f, g = relabel(f, g)
 ---> 12     for fg in compose(f, g):
      13         yield delabel(fg)
 
-<ipython-input-98-5eb7ac5ad2c2> in compose(f, g)
+<ipython-input-97-5eb7ac5ad2c2> in compose(f, g)
       1 def compose(f, g):
 ----> 2     (f_in, f_out), (g_in, g_out) = f, g
       3     s = unify(g_in, f_out)
       4     if not s:
       5         raise TypeError('Cannot unify %r and %r.' % (f_out, g_in))
 
-ValueError: need more than 1 value to unpack
+<ipython-input-98-ddee30dbb1a6> in C(f, g) + 10 def C(f, g): + 11 f, g = relabel(f, g) +---> 12 for fg in compose(f, g): + 13 yield delabel(fg) + +<ipython-input-97-5eb7ac5ad2c2> in compose(f, g) + 1 def compose(f, g): +----> 2 (f_in, f_out), (g_in, g_out) = f, g + 3 s = unify(g_in, f_out) + 4 if not s: + 5 raise TypeError('Cannot unify %r and %r.' % (f_out, g_in)) + +TypeError: 'SymbolJoyType' object is not iterable
diff --git a/docs/Types.ipynb b/docs/Types.ipynb index d72550e..e58ba4a 100644 --- a/docs/Types.ipynb +++ b/docs/Types.ipynb @@ -6,15 +6,10 @@ "source": [ "# Type Inference\n", "\n", - "This notebook presents a simple type inferencer for Joy code. It can infer the stack effect of most Joy expressions. It built largely by means of existing ideas and research (some of it may be original but I'm not able to say, as I don't fully understand the all of the source material in the depth required to make that call.) A great overview of the existing knowledge is a talk [\"Type Inference in Stack-Based Programming Languages\"](http://prl.ccs.neu.edu/blog/2017/03/10/type-inference-in-stack-based-programming-languages/) given by Rob Kleffner on or about 2017-03-10 as part of a course on the history of programming languages.\n", + "This notebook presents a simple type inferencer for Joy code. It can infer the stack effect of most Joy expressions. It's built largely by means of existing ideas and research. (A great overview of the existing knowledge is a talk [\"Type Inference in Stack-Based Programming Languages\"](http://prl.ccs.neu.edu/blog/2017/03/10/type-inference-in-stack-based-programming-languages/) given by Rob Kleffner on or about 2017-03-10 as part of a course on the history of programming languages.)\n", "\n", - "The notebook starts with a simple inferencer based on the work of Jaanus Pöial which we then progressively elaborate to cover more Joy semantics. Along the way we write a simple \"compiler\" that emits Python code for what I like to call Yin functions.\n", - "\n", - "Yin functions are those that only rearrange values in stacks, as opposed to Yang functions that actually work on the values themselves. It's interesting to note that a Joy with *only* stacks (no other kinds of values) can be made and is Turing-complete, therefore all Yang functions are actually Yin functions, and all computation can be performed by manipulations of structures of containers, which is a restatement of the Laws of Form. (Also, this implies that every program can be put into a form such that it can be computed in a single step, although that step may be enormous or unending.)\n", - "\n", - "Although I haven't completed it yet, a Joy based on Laws of Form provides the foundation for a provably correct computing system \"down to the metal\". This is my original and still primary motivation for developing Joy. (I want a proven-correct Operating System for a swarm of trash-collecting recycler robots. To trust it I have to implementment it myself from first principles, and I'm not smart enough to truly grok the existing literature and software, so I had to go look for and find LoF and Joy. Now that I have the mental tools to build my robot OS I can get down to it.\n", - "\n", - "Anyhow, here's type inference..." + "The notebook starts with a simple inferencer based on the work of Jaanus Pöial which we then progressively elaborate to cover more Joy semantics. Along the way we write a simple \"compiler\" that emits Python code for what I like to call Yin functions. (Yin functions are those that only rearrange values in stacks, as opposed to Yang functions that actually work on the values themselves.)\n", + "\n" ] }, { @@ -192,7 +187,7 @@ "outputs": [], "source": [ "def poswrd(s, e, d):\n", - " return roll_down(*swap(*pop(s, e, d)))" + " return rolldown(*swap(*pop(s, e, d)))" ] }, { @@ -230,7 +225,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Functions on Lists\n", + "### Functions on Stacks\n", "These are slightly tricky.\n", "\n", " rest ( [1 ...] -- [...] )\n", @@ -1289,9 +1284,9 @@ "source": [ "def defs():\n", "\n", - " roll_down = (1, 2, 3), (2, 3, 1)\n", + " rolldown = (1, 2, 3), (2, 3, 1)\n", "\n", - " roll_up = (1, 2, 3), (3, 1, 2)\n", + " rollup = (1, 2, 3), (3, 1, 2)\n", "\n", " pop = (1,), ()\n", "\n", @@ -1340,13 +1335,13 @@ " return (a1, stack)\n", "\n", "\n", - "def roll_down(stack):\n", + "def rolldown(stack):\n", " \"\"\"(1 2 3 -- 2 3 1)\"\"\"\n", " (a2, (a1, (a0, stack))) = stack\n", " return (a0, (a2, (a1, stack)))\n", "\n", "\n", - "def roll_up(stack):\n", + "def rollup(stack):\n", " \"\"\"(1 2 3 -- 3 1 2)\"\"\"\n", " (a2, (a1, (a0, stack))) = stack\n", " return (a1, (a0, (a2, stack)))\n", @@ -1720,7 +1715,7 @@ " pass\n", "\n", " if not isinstance(f, tuple):\n", - " seen[f] = f.__class__(c[f.prefix])\n", + " seen[f] = f.__class__(c[f.prefix] + 1)\n", " c[f.prefix] += 1\n", " return seen[f]\n", "\n", @@ -1735,7 +1730,7 @@ { "data": { "text/plain": [ - "(((a0,), (a0, a0)), ((n0, n1), (n2,)))" + "(((a1,), (a1, a1)), ((n1, n2), (n3,)))" ] }, "execution_count": 46, @@ -1822,9 +1817,9 @@ "source": [ "def defs():\n", "\n", - " roll_down = (A[1], A[2], A[3]), (A[2], A[3], A[1])\n", + " rolldown = (A[1], A[2], A[3]), (A[2], A[3], A[1])\n", "\n", - " roll_up = (A[1], A[2], A[3]), (A[3], A[1], A[2])\n", + " rollup = (A[1], A[2], A[3]), (A[3], A[1], A[2])\n", "\n", " pop = (A[1],), ()\n", "\n", @@ -1891,7 +1886,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "ccons = (a0 a1 [.0.] -- [a0 a1 .0.])\n", + "ccons = (a1 a2 [.1.] -- [a1 a2 .1.])\n", "cons = (a1 [.1.] -- [a1 .1.])\n", "divmod_ = (n2 n1 -- n4 n3)\n", "dup = (a1 -- a1 a1)\n", @@ -1906,15 +1901,15 @@ "popop = (a2 a1 --)\n", "pred = (n1 -- n2)\n", "rest = ([a1 .1.] -- [.1.])\n", - "roll_down = (a1 a2 a3 -- a2 a3 a1)\n", - "roll_up = (a1 a2 a3 -- a3 a1 a2)\n", - "rrest = ([a0 a1 .0.] -- [.0.])\n", - "second = ([a0 a1 .0.] -- a1)\n", - "sqrt = (n0 -- n1)\n", + "rolldown = (a1 a2 a3 -- a2 a3 a1)\n", + "rollup = (a1 a2 a3 -- a3 a1 a2)\n", + "rrest = ([a1 a2 .1.] -- [.1.])\n", + "second = ([a1 a2 .1.] -- a2)\n", + "sqrt = (n1 -- n2)\n", "succ = (n1 -- n2)\n", "swap = (a1 a2 -- a2 a1)\n", - "swons = ([.0.] a0 -- [a0 .0.])\n", - "third = ([a0 a1 a2 .0.] -- a2)\n", + "swons = ([.1.] a1 -- [a1 .1.])\n", + "third = ([a1 a2 a3 .1.] -- a3)\n", "tuck = (a2 a1 -- a1 a2 a1)\n", "uncons = ([a1 .1.] -- a1 [.1.])\n" ] @@ -1949,7 +1944,7 @@ { "data": { "text/plain": [ - "((n0,), (n1,))" + "((n1,), (n2,))" ] }, "execution_count": 52, @@ -1976,7 +1971,7 @@ { "data": { "text/plain": [ - "(((a0, (a1, s0)), a2, a3, a4), ((a3, (a2, s0)),))" + "(((a1, (a2, s1)), a3, a4, a5), ((a4, (a3, s1)),))" ] }, "execution_count": 53, @@ -1985,7 +1980,7 @@ } ], "source": [ - "F = reduce(C, (pop, swap, roll_down, rest, rest, cons, cons))\n", + "F = reduce(C, (pop, swap, rolldown, rest, rest, cons, cons))\n", "F" ] }, @@ -1998,7 +1993,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "([a0 a1 .0.] a2 a3 a4 -- [a3 a2 .0.])\n" + "([a1 a2 .1.] a3 a4 a5 -- [a4 a3 .1.])\n" ] } ], @@ -2032,13 +2027,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "(a0 a1 a2 -- a1 a0 a2)\n" + "(a1 a2 a3 -- a2 a1 a3)\n" ] } ], "source": [ "# e.g. [swap] dip\n", - "neato(roll_up, swap, roll_down)" + "neato(rollup, swap, rolldown)" ] }, { @@ -2050,13 +2045,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "(a0 a1 a2 a3 -- a2 a3)\n" + "(a1 a2 a3 a4 -- a3 a4)\n" ] } ], "source": [ "# e.g. [popop] dipd\n", - "neato(popdd, roll_down, pop)" + "neato(popdd, rolldown, pop)" ] }, { @@ -2068,13 +2063,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "(a0 a1 a2 -- a2 a1 a0)\n" + "(a1 a2 a3 -- a3 a2 a1)\n" ] } ], "source": [ "# Reverse the order of the top three items.\n", - "neato(roll_up, swap)" + "neato(rollup, swap)" ] }, { @@ -2116,9 +2111,9 @@ "output_type": "stream", "text": [ "def F(stack):\n", - " \"\"\"([a0 a1 .0.] a2 a3 a4 -- [a3 a2 .0.])\"\"\"\n", - " (a4, (a3, (a2, ((a0, (a1, s0)), stack)))) = stack\n", - " return ((a3, (a2, s0)), stack)\n" + " \"\"\"([a1 a2 .1.] a3 a4 a5 -- [a4 a3 .1.])\"\"\"\n", + " (a5, (a4, (a3, ((a1, (a2, s1)), stack)))) = stack\n", + " return ((a4, (a3, s1)), stack)\n" ] } ], @@ -2143,9 +2138,9 @@ "output_type": "stream", "text": [ "def sqr(stack):\n", - " \"\"\"(n0 -- n1)\"\"\"\n", - " (n0, stack) = stack\n", - " return (n1, stack)\n" + " \"\"\"(n1 -- n2)\"\"\"\n", + " (n1, stack) = stack\n", + " return (n2, stack)\n" ] } ], @@ -2192,7 +2187,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "ccons = (a0 a1 [.0.] -- [a0 a1 .0.])\n", + "ccons = (a1 a2 [.1.] -- [a1 a2 .1.])\n", "cons = (a1 [.1.] -- [a1 .1.])\n", "dup = (a1 -- a1 a1)\n", "dupd = (a2 a1 -- a2 a2 a1)\n", @@ -2203,13 +2198,13 @@ "popdd = (a3 a2 a1 -- a2 a1)\n", "popop = (a2 a1 --)\n", "rest = ([a1 .1.] -- [.1.])\n", - "roll_down = (a1 a2 a3 -- a2 a3 a1)\n", - "roll_up = (a1 a2 a3 -- a3 a1 a2)\n", - "rrest = ([a0 a1 .0.] -- [.0.])\n", - "second = ([a0 a1 .0.] -- a1)\n", + "rolldown = (a1 a2 a3 -- a2 a3 a1)\n", + "rollup = (a1 a2 a3 -- a3 a1 a2)\n", + "rrest = ([a1 a2 .1.] -- [.1.])\n", + "second = ([a1 a2 .1.] -- a2)\n", "swap = (a1 a2 -- a2 a1)\n", - "swons = ([.0.] a0 -- [a0 .0.])\n", - "third = ([a0 a1 a2 .0.] -- a2)\n", + "swons = ([.1.] a1 -- [a1 .1.])\n", + "third = ([a1 a2 a3 .1.] -- a3)\n", "tuck = (a2 a1 -- a1 a2 a1)\n", "uncons = ([a1 .1.] -- a1 [.1.])\n" ] @@ -2346,7 +2341,8 @@ " name: (sequence_to_stack(i), sequence_to_stack(o))\n", " for name, (i, o) in DEFS.iteritems()\n", "}\n", - "\n", + "NEW_DEFS['stack'] = S[0], (S[0], S[0])\n", + "NEW_DEFS['swaack'] = (S[1], S[0]), (S[0], S[1])\n", "globals().update(NEW_DEFS)" ] }, @@ -2354,23 +2350,14 @@ "cell_type": "code", "execution_count": 66, "metadata": {}, - "outputs": [], - "source": [ - "stack = S[0], (S[0], S[0])" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "((a0, s0), (s0, (a0, (a0, s0))))" + "((a1, s1), (s1, (a1, (a1, s1))))" ] }, - "execution_count": 67, + "execution_count": 66, "metadata": {}, "output_type": "execute_result" } @@ -2381,16 +2368,16 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "((a0, (a1, s0)), (s0, (a1, (a0, (a0, (a1, s0))))))" + "((a1, (a2, s1)), (s1, (a2, (a1, (a1, (a2, s1))))))" ] }, - "execution_count": 68, + "execution_count": 67, "metadata": {}, "output_type": "execute_result" } @@ -2416,7 +2403,7 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": 68, "metadata": {}, "outputs": [], "source": [ @@ -2469,7 +2456,7 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 69, "metadata": { "scrolled": false }, @@ -2478,7 +2465,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "ccons = (a0 a1 [.0.] -- [a0 a1 .0.])\n", + "ccons = (a1 a2 [.1.] -- [a1 a2 .1.])\n", "cons = (a1 [.1.] -- [a1 .1.])\n", "divmod_ = (n2 n1 -- n4 n3)\n", "dup = (a1 -- a1 a1)\n", @@ -2493,15 +2480,17 @@ "popop = (a2 a1 --)\n", "pred = (n1 -- n2)\n", "rest = ([a1 .1.] -- [.1.])\n", - "roll_down = (a1 a2 a3 -- a2 a3 a1)\n", - "roll_up = (a1 a2 a3 -- a3 a1 a2)\n", - "rrest = ([a0 a1 .0.] -- [.0.])\n", - "second = ([a0 a1 .0.] -- a1)\n", - "sqrt = (n0 -- n1)\n", + "rolldown = (a1 a2 a3 -- a2 a3 a1)\n", + "rollup = (a1 a2 a3 -- a3 a1 a2)\n", + "rrest = ([a1 a2 .1.] -- [.1.])\n", + "second = ([a1 a2 .1.] -- a2)\n", + "sqrt = (n1 -- n2)\n", + "stack = (... -- ... [...])\n", "succ = (n1 -- n2)\n", + "swaack = ([.1.] -- [.0.])\n", "swap = (a1 a2 -- a2 a1)\n", - "swons = ([.0.] a0 -- [a0 .0.])\n", - "third = ([a0 a1 a2 .0.] -- a2)\n", + "swons = ([.1.] a1 -- [a1 .1.])\n", + "third = ([a1 a2 a3 .1.] -- a3)\n", "tuck = (a2 a1 -- a1 a2 a1)\n", "uncons = ([a1 .1.] -- a1 [.1.])\n" ] @@ -2514,7 +2503,7 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 70, "metadata": {}, "outputs": [ { @@ -2524,11 +2513,11 @@ "\n", "(... -- ... [...])\n", "\n", - "(... a0 -- ... a0 a0 [...])\n", + "(... a1 -- ... a1 a1 [...])\n", "\n", - "(... a1 a0 -- ... a1 a0 a0 a1 [...])\n", + "(... a2 a1 -- ... a2 a1 a1 a2 [...])\n", "\n", - "(... a0 -- ... a0 [a0 ...])\n" + "(... a1 -- ... a1 [a1 ...])\n" ] } ], @@ -2541,14 +2530,14 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 71, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "(... a1 a0 [.0.] -- ... [a1 a0 .0.] [[a1 a0 .0.] ...])\n" + "(... a2 a1 [.1.] -- ... [a2 a1 .1.] [[a2 a1 .1.] ...])\n" ] } ], @@ -2558,16 +2547,16 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 72, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "((s0, (a0, (a1, s1))), (((a1, (a0, s0)), s1), ((a1, (a0, s0)), s1)))" + "((s1, (a1, (a2, s2))), (((a2, (a1, s1)), s2), ((a2, (a1, s1)), s2)))" ] }, - "execution_count": 73, + "execution_count": 72, "metadata": {}, "output_type": "execute_result" } @@ -2588,7 +2577,7 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 73, "metadata": {}, "outputs": [], "source": [ @@ -2604,7 +2593,7 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 74, "metadata": {}, "outputs": [ { @@ -2612,9 +2601,9 @@ "output_type": "stream", "text": [ "def Q(stack):\n", - " \"\"\"(... a1 a0 [.0.] -- ... [a1 a0 .0.] [[a1 a0 .0.] ...])\"\"\"\n", - " (s0, (a0, (a1, s1))) = stack\n", - " return (((a1, (a0, s0)), s1), ((a1, (a0, s0)), s1))\n" + " \"\"\"(... a2 a1 [.1.] -- ... [a2 a1 .1.] [[a2 a1 .1.] ...])\"\"\"\n", + " (s1, (a1, (a2, s2))) = stack\n", + " return (((a2, (a1, s1)), s2), ((a2, (a1, s1)), s2))\n" ] } ], @@ -2659,7 +2648,7 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 75, "metadata": {}, "outputs": [], "source": [ @@ -2669,7 +2658,7 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 76, "metadata": {}, "outputs": [ { @@ -2686,7 +2675,7 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 77, "metadata": {}, "outputs": [ { @@ -2703,14 +2692,14 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 78, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "(a0 [.0.] -- a0)\n" + "(a1 [.1.] -- a1)\n" ] } ], @@ -2720,14 +2709,14 @@ }, { "cell_type": "code", - "execution_count": 80, + "execution_count": 79, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "(a0 [.0.] -- [[a0 .0.] .1.])\n" + "(a1 [.1.] -- [[a1 .1.] .2.])\n" ] } ], @@ -2737,16 +2726,16 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 80, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "((s0, (a0, s1)), (a0, s0))" + "((s1, (a1, s2)), (a1, s1))" ] }, - "execution_count": 81, + "execution_count": 80, "metadata": {}, "output_type": "execute_result" } @@ -2772,7 +2761,7 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": 81, "metadata": {}, "outputs": [], "source": [ @@ -2785,7 +2774,7 @@ }, { "cell_type": "code", - "execution_count": 83, + "execution_count": 82, "metadata": {}, "outputs": [], "source": [ @@ -2799,7 +2788,7 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": 83, "metadata": {}, "outputs": [ { @@ -2820,15 +2809,15 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 84, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "(a1 -- a1 a1) (i1 i2 -- i3) (i0 -- i1)\n", - "(a1 -- a1 a1) (f1 f2 -- f3) (f0 -- f1)\n" + "(a1 -- a1 a1) (i1 i2 -- i3) (i1 -- i2)\n", + "(a1 -- a1 a1) (f1 f2 -- f3) (f1 -- f2)\n" ] } ], @@ -2843,7 +2832,7 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 85, "metadata": {}, "outputs": [], "source": [ @@ -2864,15 +2853,15 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": 86, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "(f0 -- f1)\n", - "(i0 -- i1)\n" + "(f1 -- f2)\n", + "(i1 -- i2)\n" ] } ], @@ -2883,14 +2872,14 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 87, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "(n0 -- n1)\n" + "(n1 -- n2)\n" ] } ], @@ -3017,7 +3006,7 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": 88, "metadata": {}, "outputs": [], "source": [ @@ -3082,7 +3071,7 @@ }, { "cell_type": "code", - "execution_count": 90, + "execution_count": 89, "metadata": {}, "outputs": [], "source": [ @@ -3159,7 +3148,7 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 90, "metadata": {}, "outputs": [ { @@ -3168,7 +3157,7 @@ "(a1*, s1)" ] }, - "execution_count": 91, + "execution_count": 90, "metadata": {}, "output_type": "execute_result" } @@ -3180,7 +3169,7 @@ }, { "cell_type": "code", - "execution_count": 92, + "execution_count": 91, "metadata": {}, "outputs": [ { @@ -3189,7 +3178,7 @@ "(a1, s2)" ] }, - "execution_count": 92, + "execution_count": 91, "metadata": {}, "output_type": "execute_result" } @@ -3201,7 +3190,7 @@ }, { "cell_type": "code", - "execution_count": 93, + "execution_count": 92, "metadata": {}, "outputs": [ { @@ -3220,7 +3209,7 @@ }, { "cell_type": "code", - "execution_count": 94, + "execution_count": 93, "metadata": {}, "outputs": [ { @@ -3251,7 +3240,7 @@ }, { "cell_type": "code", - "execution_count": 95, + "execution_count": 94, "metadata": {}, "outputs": [ { @@ -3270,7 +3259,7 @@ }, { "cell_type": "code", - "execution_count": 96, + "execution_count": 95, "metadata": {}, "outputs": [ { @@ -3289,7 +3278,7 @@ }, { "cell_type": "code", - "execution_count": 97, + "execution_count": 96, "metadata": {}, "outputs": [ { @@ -3332,7 +3321,7 @@ }, { "cell_type": "code", - "execution_count": 98, + "execution_count": 97, "metadata": {}, "outputs": [], "source": [ @@ -3354,7 +3343,7 @@ }, { "cell_type": "code", - "execution_count": 99, + "execution_count": 98, "metadata": {}, "outputs": [], "source": [ @@ -3375,15 +3364,15 @@ }, { "cell_type": "code", - "execution_count": 100, + "execution_count": 99, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "(f0 -- f1)\n", - "(i0 -- i1)\n" + "(f1 -- f2)\n", + "(i1 -- i2)\n" ] } ], @@ -3394,14 +3383,14 @@ }, { "cell_type": "code", - "execution_count": 101, + "execution_count": 100, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "([n0* .0.] -- [n0* .0.] n0)\n" + "([n1* .1.] -- [n1* .1.] n1)\n" ] } ], @@ -3414,15 +3403,15 @@ }, { "cell_type": "code", - "execution_count": 102, + "execution_count": 101, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "(a0 [.0.] -- n0)\n", - "(n0 [n0* .0.] -- n1)\n" + "(a1 [.1.] -- n1)\n", + "(n1 [n1* .1.] -- n2)\n" ] } ], @@ -3435,14 +3424,14 @@ }, { "cell_type": "code", - "execution_count": 103, + "execution_count": 102, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "(a1 [.1.] -- [a1 .1.]) ([n1 n1* .1.] -- n0) (n0 [n0* .0.] -- n1)\n" + "(a1 [.1.] -- [a1 .1.]) ([n1 n1* .1.] -- n0) (n1 [n1* .1.] -- n2)\n" ] } ], @@ -3478,7 +3467,7 @@ }, { "cell_type": "code", - "execution_count": 104, + "execution_count": 103, "metadata": {}, "outputs": [ { @@ -3487,7 +3476,7 @@ "(a4, (a1*, (a3, s1)))" ] }, - "execution_count": 104, + "execution_count": 103, "metadata": {}, "output_type": "execute_result" } @@ -3499,7 +3488,7 @@ }, { "cell_type": "code", - "execution_count": 105, + "execution_count": 104, "metadata": {}, "outputs": [ { @@ -3508,7 +3497,7 @@ "(a1, (a2, s2))" ] }, - "execution_count": 105, + "execution_count": 104, "metadata": {}, "output_type": "execute_result" } @@ -3520,7 +3509,7 @@ }, { "cell_type": "code", - "execution_count": 106, + "execution_count": 105, "metadata": {}, "outputs": [ { @@ -3539,7 +3528,7 @@ }, { "cell_type": "code", - "execution_count": 107, + "execution_count": 106, "metadata": {}, "outputs": [ { @@ -3625,7 +3614,34 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "I think there's a way forward. If we convert our list of terms we are composing into a stack structure we can use it as a *Joy expression*, then we can treat the *output half* of a function's stack effect comment as a Joy interpreter stack, and just execute combinators directly. We can hybridize the compostition function with an interpreter to evaluate combinators, compose non-combinator functions, and put type variables on the stack. For combinators like `branch` that can have more than one stack effect we have to \"split universes\" again and return both. (Note: bug! If one branch doesn't type check the currect code ignores it, so you can think things are okay but have a type error waiting in the faled branch, I think... D'oh! FIXME!!!)" + "I think there's a way forward. If we convert our list of terms we are composing into a stack structure we can use it as a *Joy expression*, then we can treat the *output half* of a function's stack effect comment as a Joy interpreter stack, and just execute combinators directly. We can hybridize the compostition function with an interpreter to evaluate combinators, compose non-combinator functions, and put type variables on the stack. For combinators like `branch` that can have more than one stack effect we have to \"split universes\" again and return both." + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "metadata": {}, + "outputs": [], + "source": [ + "class FunctionJoyType(AnyJoyType):\n", + "\n", + " def __init__(self, name, sec, number):\n", + " self.name = name\n", + " self.stack_effects = sec\n", + " self.number = number\n", + "\n", + " def __add__(self, other):\n", + " return self\n", + " __radd__ = __add__\n", + "\n", + " def __repr__(self):\n", + " return self.name\n", + "\n", + "\n", + "class SymbolJoyType(FunctionJoyType): prefix = 'F'\n", + "class CombinatorJoyType(FunctionJoyType): prefix = 'C'\n", + "\n", + "\n" ] }, { @@ -3634,7 +3650,36 @@ "metadata": {}, "outputs": [], "source": [ - "stack_concat = lambda q, e: (q[0], stack_concat(q[1], e)) if q else e" + "def flatten(g):\n", + " return list(chain.from_iterable(g))\n", + "\n", + "\n", + "ID = S[0], S[0] # Identity function.\n", + "\n", + "\n", + "def infer(e, F=ID):\n", + " if not e:\n", + " return [F]\n", + "\n", + " n, e = e\n", + "\n", + " if isinstance(n, SymbolJoyType):\n", + " res = flatten(infer(e, Fn) for Fn in MC([F], n.stack_effects))\n", + "\n", + " elif isinstance(n, CombinatorJoyType):\n", + " res = []\n", + " for combinator in n.stack_effects:\n", + " fi, fo = F\n", + " new_fo, ee, _ = combinator(fo, e, {})\n", + " ee = update(FUNCTIONS, ee) # Fix Symbols.\n", + " new_F = fi, new_fo\n", + " res.extend(infer(ee, new_F))\n", + " else:\n", + " lit = s9, (n, s9)\n", + " res = flatten(infer(e, Fn) for Fn in MC([F], [lit]))\n", + "\n", + " return res\n", + "\n" ] }, { @@ -3643,65 +3688,10 @@ "metadata": {}, "outputs": [], "source": [ - "class SymbolJoyType(AnyJoyType):\n", - " prefix = 'F'\n", - "\n", - " def __init__(self, name, sec, number):\n", - " self.name = name\n", - " self.stack_effects = sec\n", - " self.number = number\n", - "\n", - "class CombinatorJoyType(SymbolJoyType): prefix = 'C'\n", - "\n", - "def dip_t(stack, expression):\n", - " (quote, (a1, stack)) = stack\n", - " expression = stack_concat(quote, (a1, expression))\n", - " return stack, expression\n", - "\n", - "CONS = SymbolJoyType('cons', [cons], 23)\n", - "DIP = CombinatorJoyType('dip', [dip_t], 44)\n", - "\n", - "\n", - "def kav(F, e):\n", - " #i, stack = F\n", - " if not e:\n", - " return [(F, e)]\n", - " n, e = e\n", - " if isinstance(n, SymbolJoyType):\n", - " Fs = []\n", - " for sec in n.stack_effects:\n", - " Fs.extend(MC([F], sec))\n", - " return [kav(Fn, e) for Fn in Fs]\n", - " if isinstance(n, CombinatorJoyType):\n", - " res = []\n", - " for f in n.stack_effects:\n", - " s, e = f(F[1], e)\n", - " new_F = F[0], s\n", - " res.extend(kav(new_F, e))\n", - " return res\n", - " lit = S[0], (n, S[0])\n", - " return [kav(Fn, e) for Fn in MC([F], [lit])]\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "compare, and be amazed:" + "f0, f1, f2, f3, f4, f5, f6, f7, f8, f9 = F = map(FloatJoyType, _R)\n", + "i0, i1, i2, i3, i4, i5, i6, i7, i8, i9 = I = map(IntJoyType, _R)\n", + "n0, n1, n2, n3, n4, n5, n6, n7, n8, n9 = N\n", + "s0, s1, s2, s3, s4, s5, s6, s7, s8, s9 = S" ] }, { @@ -3710,10 +3700,48 @@ "metadata": {}, "outputs": [], "source": [ - "def dip_t(stack, expression):\n", - " (quote, (a1, stack)) = stack\n", - " expression = stack_concat(quote, (a1, expression))\n", - " return stack, expression" + "import joy.library\n", + "\n", + "FNs = '''ccons cons divmod_ dup dupd first\n", + " over pm pop popd popdd popop pred\n", + " rest rolldown rollup rrest second\n", + " sqrt stack succ swaack swap swons\n", + " third tuck uncons'''\n", + "\n", + "FUNCTIONS = {\n", + " name: SymbolJoyType(name, [NEW_DEFS[name]], i)\n", + " for i, name in enumerate(FNs.strip().split())\n", + " }\n", + "FUNCTIONS['sum'] = SymbolJoyType('sum', [(((Ns[1], s1), s0), (n0, s0))], 100)\n", + "FUNCTIONS['mul'] = SymbolJoyType('mul', [\n", + " ((i2, (i1, s0)), (i3, s0)),\n", + " ((f2, (i1, s0)), (f3, s0)),\n", + " ((i2, (f1, s0)), (f3, s0)),\n", + " ((f2, (f1, s0)), (f3, s0)),\n", + "], 101)\n", + "FUNCTIONS.update({\n", + " combo.__name__: CombinatorJoyType(combo.__name__, [combo], i)\n", + " for i, combo in enumerate((\n", + " joy.library.i,\n", + " joy.library.dip,\n", + " joy.library.dipd,\n", + " joy.library.dipdd,\n", + " joy.library.dupdip,\n", + " joy.library.b,\n", + " joy.library.x,\n", + " joy.library.infra,\n", + " ))\n", + " })\n", + "\n", + "def branch_true(stack, expression, dictionary):\n", + " (then, (else_, (flag, stack))) = stack\n", + " return stack, CONCAT(then, expression), dictionary\n", + "\n", + "def branch_false(stack, expression, dictionary):\n", + " (then, (else_, (flag, stack))) = stack\n", + " return stack, CONCAT(else_, expression), dictionary\n", + "\n", + "FUNCTIONS['branch'] = CombinatorJoyType('branch', [branch_true, branch_false], 100)" ] }, { @@ -3722,10 +3750,181 @@ "metadata": {}, "outputs": [], "source": [ - "def dip(stack, expression, dictionary):\n", - " (quote, (x, stack)) = stack\n", - " expression = (x, expression)\n", - " return stack, concat(quote, expression), dictionary" + "globals().update(FUNCTIONS)" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "metadata": {}, + "outputs": [], + "source": [ + "from itertools import chain\n", + "from joy.utils.stack import list_to_stack as l2s" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "metadata": {}, + "outputs": [], + "source": [ + "expression = l2s([n1, n2, (mul, s2), (stack, s3), dip, infra, first])" + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(n1, (n2, ((mul, s2), ((stack, s3), (dip, (infra, (first, ())))))))" + ] + }, + "execution_count": 114, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "expression" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "metadata": {}, + "outputs": [], + "source": [ + "expression = l2s([n1, n2, mul])" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(n1, (n2, (mul, ())))" + ] + }, + "execution_count": 116, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "expression" + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[(s1, (f1, s1)), (s1, (i1, s1))]" + ] + }, + "execution_count": 117, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "infer(expression)" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[(s1, (f1, s1)), (s1, (i1, s1))]" + ] + }, + "execution_count": 118, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "infer(expression)" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(-- f1)\n", + "(-- i1)\n" + ] + } + ], + "source": [ + "for stack_effect_comment in infer(expression):\n", + " print doc_from_stack_effect(*stack_effect_comment)" + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(n1, (n2, (mul, ())))" + ] + }, + "execution_count": 123, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "expression" + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[(s1, (f1, s1)), (s1, (i1, s1))]" + ] + }, + "execution_count": 124, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "infer(expression)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And that brings us to current Work-In-Progress. I'm pretty hopeful that the mixed-mode inferencer/interpreter `infer()` function along with the ability to specify multiple implementations for the combinators will permit modelling of the stack effects of e.g. `ifte`. If I can keep up the pace I should be able to verify that conjecture by the end of June." ] }, { @@ -3855,10 +4054,26 @@ "source": [] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 137, + "metadata": {}, + "outputs": [], "source": [ - "And that brings us to current Work-In-Progress. I'm pretty hopeful that the mixed-mode inferencer/interpreter `kav()` function along with the ability to specify multiple implementations for the combinators will permit modelling of the stack effects of e.g. `ifte`. If I can keep up the pace I should be able to verify that conjecture by the end of June." + "hasattr?" ] }, { @@ -3878,40 +4093,43 @@ }, { "cell_type": "code", - "execution_count": 112, + "execution_count": 173, "metadata": {}, - "outputs": [ - { - "ename": "ValueError", - "evalue": "need more than 1 value to unpack", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mF\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mreduce\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mC\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mpop\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mswap\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mroll_down\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrest\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrest\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcons\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcons\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mdoc_from_stack_effect\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mF\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mC\u001b[0;34m(f, g)\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mC\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrelabel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 12\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mfg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcompose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 13\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0mdelabel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mcompose\u001b[0;34m(f, g)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mcompose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;34m(\u001b[0m\u001b[0mf_in\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf_out\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mg_in\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg_out\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0munify\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg_in\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf_out\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Cannot unify %r and %r.'\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mf_out\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg_in\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mC\u001b[0;34m(f, g)\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mC\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrelabel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 12\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mfg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcompose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 13\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0mdelabel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mcompose\u001b[0;34m(f, g)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mcompose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;34m(\u001b[0m\u001b[0mf_in\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf_out\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mg_in\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg_out\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0munify\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg_in\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf_out\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Cannot unify %r and %r.'\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mf_out\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg_in\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mC\u001b[0;34m(f, g)\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mC\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrelabel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 12\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mfg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcompose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 13\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0mdelabel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mcompose\u001b[0;34m(f, g)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mcompose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;34m(\u001b[0m\u001b[0mf_in\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf_out\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mg_in\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg_out\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0munify\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg_in\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf_out\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Cannot unify %r and %r.'\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mf_out\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg_in\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mC\u001b[0;34m(f, g)\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mC\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrelabel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 12\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mfg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcompose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 13\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0mdelabel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mcompose\u001b[0;34m(f, g)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mcompose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;34m(\u001b[0m\u001b[0mf_in\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf_out\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mg_in\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg_out\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0munify\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg_in\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf_out\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Cannot unify %r and %r.'\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mf_out\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg_in\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mC\u001b[0;34m(f, g)\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mC\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrelabel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 12\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mfg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcompose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 13\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0mdelabel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mcompose\u001b[0;34m(f, g)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mcompose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;34m(\u001b[0m\u001b[0mf_in\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf_out\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mg_in\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg_out\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0munify\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg_in\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf_out\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Cannot unify %r and %r.'\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mf_out\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg_in\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mValueError\u001b[0m: need more than 1 value to unpack" - ] - } - ], + "outputs": [], "source": [ - "F = reduce(C, (pop, swap, roll_down, rest, rest, cons, cons))\n", + "def _ge(self, other):\n", + " return (issubclass(other.__class__, self.__class__)\n", + " or hasattr(self, 'accept')\n", + " and isinstance(other, self.accept))\n", "\n", - "print doc_from_stack_effect(*F)" + "AnyJoyType.__ge__ = _ge\n", + "AnyJoyType.accept = tuple, int, float, long, str, unicode, bool, Symbol\n", + "StackJoyType.accept = tuple" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 174, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "([a4 a5 .1.] a3 a2 a1 -- [a2 a3 .1.])\n" + ] + } + ], + "source": [ + "F = infer(l2s((pop, swap, rolldown, rest, rest, cons, cons)))\n", + "\n", + "for f in F:\n", + " print doc_from_stack_effect(*f)" + ] + }, + { + "cell_type": "code", + "execution_count": 126, "metadata": {}, "outputs": [], "source": [ @@ -3923,18 +4141,94 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "s = text_to_expression('[3 4 ...] 2 1')\n", - "s" - ] + "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 166, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(a3 a2 a1 --)\n" + ] + } + ], "source": [ - "L = unify(F[1], s)\n", + "F = infer(l2s((pop, pop, pop)))\n", + "\n", + "for f in F:\n", + " print doc_from_stack_effect(*f)" + ] + }, + { + "cell_type": "code", + "execution_count": 167, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0, (1, (2, ())))" + ] + }, + "execution_count": 167, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s = text_to_expression('0 1 2')\n", + "s" + ] + }, + { + "cell_type": "code", + "execution_count": 168, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(a1, (a2, (a3, s1)))" + ] + }, + "execution_count": 168, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "F[0][0]" + ] + }, + { + "cell_type": "code", + "execution_count": 171, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "()" + ] + }, + "execution_count": 171, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "L = unify(s, F[0][0])\n", "L" ] }, @@ -3943,8 +4237,103 @@ "execution_count": null, "metadata": {}, "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 161, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0, (1, (2, ((3, (4, ())), ()))))" + ] + }, + "execution_count": 161, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "F[1]" + "s = text_to_expression('0 1 2 [3 4]')\n", + "s" + ] + }, + { + "cell_type": "code", + "execution_count": 162, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(a1, (a2, (a3, ((a4, (a5, s1)), s2))))" + ] + }, + "execution_count": 162, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "F[0][0]" + ] + }, + { + "cell_type": "code", + "execution_count": 163, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "()" + ] + }, + "execution_count": 163, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "L = unify(s, F[0][0])\n", + "L" + ] + }, + { + "cell_type": "code", + "execution_count": 164, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "()" + ] + }, + "execution_count": 164, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "L = unify(F[0][0], s)\n", + "L" ] }, { @@ -3967,10 +4356,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 156, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 156, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A[1] >= 23" + ] }, { "cell_type": "code", @@ -4412,6 +4814,125 @@ "metadata": {}, "outputs": [], "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "class SymbolJoyType(AnyJoyType):\n", + " prefix = 'F'\n", + "\n", + " def __init__(self, name, sec, number):\n", + " self.name = name\n", + " self.stack_effects = sec\n", + " self.number = number\n", + "\n", + "class CombinatorJoyType(SymbolJoyType): prefix = 'C'\n", + "\n", + "def dip_t(stack, expression):\n", + " (quote, (a1, stack)) = stack\n", + " expression = stack_concat(quote, (a1, expression))\n", + " return stack, expression\n", + "\n", + "CONS = SymbolJoyType('cons', [cons], 23)\n", + "DIP = CombinatorJoyType('dip', [dip_t], 44)\n", + "\n", + "\n", + "def kav(F, e):\n", + " #i, stack = F\n", + " if not e:\n", + " return [(F, e)]\n", + " n, e = e\n", + " if isinstance(n, SymbolJoyType):\n", + " Fs = []\n", + " for sec in n.stack_effects:\n", + " Fs.extend(MC([F], sec))\n", + " return [kav(Fn, e) for Fn in Fs]\n", + " if isinstance(n, CombinatorJoyType):\n", + " res = []\n", + " for f in n.stack_effects:\n", + " s, e = f(F[1], e)\n", + " new_F = F[0], s\n", + " res.extend(kav(new_F, e))\n", + " return res\n", + " lit = S[0], (n, S[0])\n", + " return [kav(Fn, e) for Fn in MC([F], [lit])]\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "compare, and be amazed:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def dip_t(stack, expression):\n", + " (quote, (a1, stack)) = stack\n", + " expression = stack_concat(quote, (a1, expression))\n", + " return stack, expression" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def dip(stack, expression, dictionary):\n", + " (quote, (x, stack)) = stack\n", + " expression = (x, expression)\n", + " return stack, concat(quote, expression), dictionary" + ] } ], "metadata": { diff --git a/docs/Types.md b/docs/Types.md index 395fcda..0261bbe 100644 --- a/docs/Types.md +++ b/docs/Types.md @@ -127,7 +127,7 @@ The simplest way to "compile" this function would be something like: ```python def poswrd(s, e, d): - return roll_down(*swap(*pop(s, e, d))) + return rolldown(*swap(*pop(s, e, d))) ``` However, internally this function would still be allocating tuples (stack cells) and doing other unnecesssary work. @@ -829,9 +829,9 @@ We can use `compile_()` to generate many primitives in the library from their st ```python def defs(): - roll_down = (1, 2, 3), (2, 3, 1) + rolldown = (1, 2, 3), (2, 3, 1) - roll_up = (1, 2, 3), (3, 1, 2) + rollup = (1, 2, 3), (3, 1, 2) pop = (1,), () @@ -877,13 +877,13 @@ for name, stack_effect_comment in sorted(defs().items()): return (a1, stack) - def roll_down(stack): + def rolldown(stack): """(1 2 3 -- 2 3 1)""" (a2, (a1, (a0, stack))) = stack return (a0, (a2, (a1, stack))) - def roll_up(stack): + def rollup(stack): """(1 2 3 -- 3 1 2)""" (a2, (a1, (a0, stack))) = stack return (a1, (a0, (a2, stack))) @@ -1218,9 +1218,9 @@ Rewrite the stack effect comments: ```python def defs(): - roll_down = (A[1], A[2], A[3]), (A[2], A[3], A[1]) + rolldown = (A[1], A[2], A[3]), (A[2], A[3], A[1]) - roll_up = (A[1], A[2], A[3]), (A[3], A[1], A[2]) + rollup = (A[1], A[2], A[3]), (A[3], A[1], A[2]) pop = (A[1],), () @@ -1295,8 +1295,8 @@ for name, stack_effect_comment in sorted(DEFS.items()): popop = (a2 a1 --) pred = (n1 -- n2) rest = ([a1 .1.] -- [.1.]) - roll_down = (a1 a2 a3 -- a2 a3 a1) - roll_up = (a1 a2 a3 -- a3 a1 a2) + rolldown = (a1 a2 a3 -- a2 a3 a1) + rollup = (a1 a2 a3 -- a3 a1 a2) rrest = ([a0 a1 .0.] -- [.0.]) second = ([a0 a1 .0.] -- a1) sqrt = (n0 -- n1) @@ -1331,7 +1331,7 @@ Revisit the `F` function, works fine. ```python -F = reduce(C, (pop, swap, roll_down, rest, rest, cons, cons)) +F = reduce(C, (pop, swap, rolldown, rest, rest, cons, cons)) F ``` @@ -1361,7 +1361,7 @@ def neato(*funcs): ```python # e.g. [swap] dip -neato(roll_up, swap, roll_down) +neato(rollup, swap, rolldown) ``` (a0 a1 a2 -- a1 a0 a2) @@ -1370,7 +1370,7 @@ neato(roll_up, swap, roll_down) ```python # e.g. [popop] dipd -neato(popdd, roll_down, pop) +neato(popdd, rolldown, pop) ``` (a0 a1 a2 a3 -- a2 a3) @@ -1379,7 +1379,7 @@ neato(popdd, roll_down, pop) ```python # Reverse the order of the top three items. -neato(roll_up, swap) +neato(rollup, swap) ``` (a0 a1 a2 -- a2 a1 a0) @@ -1461,8 +1461,8 @@ for name, stack_effect_comment in sorted(defs().items()): popdd = (a3 a2 a1 -- a2 a1) popop = (a2 a1 --) rest = ([a1 .1.] -- [.1.]) - roll_down = (a1 a2 a3 -- a2 a3 a1) - roll_up = (a1 a2 a3 -- a3 a1 a2) + rolldown = (a1 a2 a3 -- a2 a3 a1) + rollup = (a1 a2 a3 -- a3 a1 a2) rrest = ([a0 a1 .0.] -- [.0.]) second = ([a0 a1 .0.] -- a1) swap = (a1 a2 -- a2 a1) @@ -1554,16 +1554,12 @@ NEW_DEFS = { name: (sequence_to_stack(i), sequence_to_stack(o)) for name, (i, o) in DEFS.iteritems() } - +NEW_DEFS['stack'] = S[0], (S[0], S[0]) +NEW_DEFS['swaack'] = (S[1], S[0]), (S[0], S[1]) globals().update(NEW_DEFS) ``` -```python -stack = S[0], (S[0], S[0]) -``` - - ```python C(stack, uncons) ``` @@ -1662,12 +1658,14 @@ for name, stack_effect_comment in sorted(NEW_DEFS.items()): popop = (a2 a1 --) pred = (n1 -- n2) rest = ([a1 .1.] -- [.1.]) - roll_down = (a1 a2 a3 -- a2 a3 a1) - roll_up = (a1 a2 a3 -- a3 a1 a2) + rolldown = (a1 a2 a3 -- a2 a3 a1) + rollup = (a1 a2 a3 -- a3 a1 a2) rrest = ([a0 a1 .0.] -- [.0.]) second = ([a0 a1 .0.] -- a1) sqrt = (n0 -- n1) + stack = (... -- ... [...]) succ = (n1 -- n2) + swaack = ([.1.] -- [.0.]) swap = (a1 a2 -- a2 a1) swons = ([.0.] a0 -- [a0 .0.]) third = ([a0 a1 a2 .0.] -- a2) @@ -2268,14 +2266,167 @@ Obviously it would be: Without any information about the contents of the quote we can't say much about the result. -I think there's a way forward. If we convert our list of terms we are composing into a stack structure we can use it as a *Joy expression*, then we can treat the *output half* of a function's stack effect comment as a Joy interpreter stack, and just execute combinators directly. We can hybridize the compostition function with an interpreter to evaluate combinators, compose non-combinator functions, and put type variables on the stack. For combinators like `branch` that can have more than one stack effect we have to "split universes" again and return both. (Note: bug! If one branch doesn't type check the currect code ignores it, so you can think things are okay but have a type error waiting in the faled branch, I think... D'oh! FIXME!!!) +I think there's a way forward. If we convert our list of terms we are composing into a stack structure we can use it as a *Joy expression*, then we can treat the *output half* of a function's stack effect comment as a Joy interpreter stack, and just execute combinators directly. We can hybridize the compostition function with an interpreter to evaluate combinators, compose non-combinator functions, and put type variables on the stack. For combinators like `branch` that can have more than one stack effect we have to "split universes" again and return both. ```python -stack_concat = lambda q, e: (q[0], stack_concat(q[1], e)) if q else e +class FunctionJoyType(AnyJoyType): + + def __init__(self, name, sec, number): + self.name = name + self.stack_effects = sec + self.number = number + + def __add__(self, other): + return self + __radd__ = __add__ + + def __repr__(self): + return self.name + + +class SymbolJoyType(FunctionJoyType): prefix = 'F' +class CombinatorJoyType(FunctionJoyType): prefix = 'C' + + + ``` +```python +def flatten(g): + return list(chain.from_iterable(g)) + + +ID = S[0], S[0] # Identity function. + + +def infer(e, F=ID): + if not e: + return [F] + + n, e = e + + if isinstance(n, SymbolJoyType): + res = flatten(infer(e, Fn) for Fn in MC([F], n.stack_effects)) + + elif isinstance(n, CombinatorJoyType): + res = [] + for combinator in n.stack_effects: + fi, fo = F + new_fo, ee, _ = combinator(fo, e, {}) + ee = update(FUNCTIONS, ee) # Fix Symbols. + new_F = fi, new_fo + res.extend(infer(ee, new_F)) + else: + lit = s9, (n, s9) + res = flatten(infer(e, Fn) for Fn in MC([F], [lit])) + + return res + + +``` + + +```python +f0, f1, f2, f3, f4, f5, f6, f7, f8, f9 = F = map(FloatJoyType, _R) +i0, i1, i2, i3, i4, i5, i6, i7, i8, i9 = I = map(IntJoyType, _R) +n0, n1, n2, n3, n4, n5, n6, n7, n8, n9 = N +s0, s1, s2, s3, s4, s5, s6, s7, s8, s9 = S +``` + + +```python +import joy.library + +FNs = '''ccons cons divmod_ dup dupd first + over pm pop popd popdd popop pred + rest rolldown rollup rrest second + sqrt stack succ swaack swap swons + third tuck uncons''' + +FUNCTIONS = { + name: SymbolJoyType(name, [NEW_DEFS[name]], i) + for i, name in enumerate(FNs.strip().split()) + } +FUNCTIONS['sum'] = SymbolJoyType('sum', [(((Ns[1], s1), s0), (n0, s0))], 100) +FUNCTIONS['mul'] = SymbolJoyType('mul', [ + ((i2, (i1, s0)), (i3, s0)), + ((f2, (i1, s0)), (f3, s0)), + ((i2, (f1, s0)), (f3, s0)), + ((f2, (f1, s0)), (f3, s0)), +], 101) +FUNCTIONS.update({ + combo.__name__: CombinatorJoyType(combo.__name__, [combo], i) + for i, combo in enumerate(( + joy.library.i, + joy.library.dip, + joy.library.dipd, + joy.library.dipdd, + joy.library.dupdip, + joy.library.b, + joy.library.x, + joy.library.infra, + )) + }) + +def branch_true(stack, expression, dictionary): + (then, (else_, (flag, stack))) = stack + return stack, CONCAT(then, expression), dictionary + +def branch_false(stack, expression, dictionary): + (then, (else_, (flag, stack))) = stack + return stack, CONCAT(else_, expression), dictionary + +FUNCTIONS['branch'] = CombinatorJoyType('branch', [branch_true, branch_false], 100) +``` + + +```python +globals().update(FUNCTIONS) +``` + + +```python +from itertools import chain +from joy.utils.stack import list_to_stack as l2s +``` + + +```python +expression = l2s([n1, n2, (mul, s2), (stack, s3), dip, infra, first]) +``` + + +```python +expression +``` + + + + + (n1, (n2, ((mul, s2), ((stack, s3), (dip, (infra, (first, ()))))))) + + + + +```python +expression = l2s([n1, n2, mul]) +``` + + +```python +infer(expression) +``` + + + + + [] + + + + ```python class SymbolJoyType(AnyJoyType): prefix = 'F' @@ -2345,7 +2496,7 @@ For this to work the type label classes have to be modified to let `T >= t` succ ```python -F = reduce(C, (pop, swap, roll_down, rest, rest, cons, cons)) +F = reduce(C, (pop, swap, rolldown, rest, rest, cons, cons)) print doc_from_stack_effect(*F) ``` @@ -2353,22 +2504,22 @@ print doc_from_stack_effect(*F) --------------------------------------------------------------------------- - ValueError Traceback (most recent call last) + TypeError Traceback (most recent call last) - in () - 1 F = reduce(C, (pop, swap, roll_down, rest, rest, cons, cons)) + in () + 1 F = reduce(C, (pop, swap, rolldown, rest, rest, cons, cons)) 2 ----> 3 print doc_from_stack_effect(*F) - in C(f, g) + in C(f, g) 10 def C(f, g): 11 f, g = relabel(f, g) ---> 12 for fg in compose(f, g): 13 yield delabel(fg) - in compose(f, g) + in compose(f, g) 1 def compose(f, g): ----> 2 (f_in, f_out), (g_in, g_out) = f, g 3 s = unify(g_in, f_out) @@ -2376,14 +2527,14 @@ print doc_from_stack_effect(*F) 5 raise TypeError('Cannot unify %r and %r.' % (f_out, g_in)) - in C(f, g) + in C(f, g) 10 def C(f, g): 11 f, g = relabel(f, g) ---> 12 for fg in compose(f, g): 13 yield delabel(fg) - in compose(f, g) + in compose(f, g) 1 def compose(f, g): ----> 2 (f_in, f_out), (g_in, g_out) = f, g 3 s = unify(g_in, f_out) @@ -2391,14 +2542,14 @@ print doc_from_stack_effect(*F) 5 raise TypeError('Cannot unify %r and %r.' % (f_out, g_in)) - in C(f, g) + in C(f, g) 10 def C(f, g): 11 f, g = relabel(f, g) ---> 12 for fg in compose(f, g): 13 yield delabel(fg) - in compose(f, g) + in compose(f, g) 1 def compose(f, g): ----> 2 (f_in, f_out), (g_in, g_out) = f, g 3 s = unify(g_in, f_out) @@ -2406,14 +2557,14 @@ print doc_from_stack_effect(*F) 5 raise TypeError('Cannot unify %r and %r.' % (f_out, g_in)) - in C(f, g) + in C(f, g) 10 def C(f, g): 11 f, g = relabel(f, g) ---> 12 for fg in compose(f, g): 13 yield delabel(fg) - in compose(f, g) + in compose(f, g) 1 def compose(f, g): ----> 2 (f_in, f_out), (g_in, g_out) = f, g 3 s = unify(g_in, f_out) @@ -2421,14 +2572,14 @@ print doc_from_stack_effect(*F) 5 raise TypeError('Cannot unify %r and %r.' % (f_out, g_in)) - in C(f, g) + in C(f, g) 10 def C(f, g): 11 f, g = relabel(f, g) ---> 12 for fg in compose(f, g): 13 yield delabel(fg) - in compose(f, g) + in compose(f, g) 1 def compose(f, g): ----> 2 (f_in, f_out), (g_in, g_out) = f, g 3 s = unify(g_in, f_out) @@ -2436,7 +2587,22 @@ print doc_from_stack_effect(*F) 5 raise TypeError('Cannot unify %r and %r.' % (f_out, g_in)) - ValueError: need more than 1 value to unpack + in C(f, g) + 10 def C(f, g): + 11 f, g = relabel(f, g) + ---> 12 for fg in compose(f, g): + 13 yield delabel(fg) + + + in compose(f, g) + 1 def compose(f, g): + ----> 2 (f_in, f_out), (g_in, g_out) = f, g + 3 s = unify(g_in, f_out) + 4 if not s: + 5 raise TypeError('Cannot unify %r and %r.' % (f_out, g_in)) + + + TypeError: 'SymbolJoyType' object is not iterable diff --git a/docs/Types.rst b/docs/Types.rst index 4a1a80d..216ce90 100644 --- a/docs/Types.rst +++ b/docs/Types.rst @@ -211,7 +211,7 @@ The simplest way to "compile" this function would be something like: .. code:: ipython2 def poswrd(s, e, d): - return roll_down(*swap(*pop(s, e, d))) + return rolldown(*swap(*pop(s, e, d))) However, internally this function would still be allocating tuples (stack cells) and doing other unnecesssary work. @@ -1045,9 +1045,9 @@ from their stack effect comments: def defs(): - roll_down = (1, 2, 3), (2, 3, 1) + rolldown = (1, 2, 3), (2, 3, 1) - roll_up = (1, 2, 3), (3, 1, 2) + rollup = (1, 2, 3), (3, 1, 2) pop = (1,), () @@ -1094,13 +1094,13 @@ from their stack effect comments: return (a1, stack) - def roll_down(stack): + def rolldown(stack): """(1 2 3 -- 2 3 1)""" (a2, (a1, (a0, stack))) = stack return (a0, (a2, (a1, stack))) - def roll_up(stack): + def rollup(stack): """(1 2 3 -- 3 1 2)""" (a2, (a1, (a0, stack))) = stack return (a1, (a0, (a2, stack))) @@ -1482,9 +1482,9 @@ Rewrite the stack effect comments: def defs(): - roll_down = (A[1], A[2], A[3]), (A[2], A[3], A[1]) + rolldown = (A[1], A[2], A[3]), (A[2], A[3], A[1]) - roll_up = (A[1], A[2], A[3]), (A[3], A[1], A[2]) + rollup = (A[1], A[2], A[3]), (A[3], A[1], A[2]) pop = (A[1],), () @@ -1559,8 +1559,8 @@ Rewrite the stack effect comments: popop = (a2 a1 --) pred = (n1 -- n2) rest = ([a1 .1.] -- [.1.]) - roll_down = (a1 a2 a3 -- a2 a3 a1) - roll_up = (a1 a2 a3 -- a3 a1 a2) + rolldown = (a1 a2 a3 -- a2 a3 a1) + rollup = (a1 a2 a3 -- a3 a1 a2) rrest = ([a0 a1 .0.] -- [.0.]) second = ([a0 a1 .0.] -- a1) sqrt = (n0 -- n1) @@ -1596,7 +1596,7 @@ Revisit the ``F`` function, works fine. .. code:: ipython2 - F = reduce(C, (pop, swap, roll_down, rest, rest, cons, cons)) + F = reduce(C, (pop, swap, rolldown, rest, rest, cons, cons)) F @@ -1629,7 +1629,7 @@ also get the effect of combinators in some limited cases. .. code:: ipython2 # e.g. [swap] dip - neato(roll_up, swap, roll_down) + neato(rollup, swap, rolldown) .. parsed-literal:: @@ -1640,7 +1640,7 @@ also get the effect of combinators in some limited cases. .. code:: ipython2 # e.g. [popop] dipd - neato(popdd, roll_down, pop) + neato(popdd, rolldown, pop) .. parsed-literal:: @@ -1651,7 +1651,7 @@ also get the effect of combinators in some limited cases. .. code:: ipython2 # Reverse the order of the top three items. - neato(roll_up, swap) + neato(rollup, swap) .. parsed-literal:: @@ -1753,8 +1753,8 @@ comments. We can write a function to check that: popdd = (a3 a2 a1 -- a2 a1) popop = (a2 a1 --) rest = ([a1 .1.] -- [.1.]) - roll_down = (a1 a2 a3 -- a2 a3 a1) - roll_up = (a1 a2 a3 -- a3 a1 a2) + rolldown = (a1 a2 a3 -- a2 a3 a1) + rollup = (a1 a2 a3 -- a3 a1 a2) rrest = ([a0 a1 .0.] -- [.0.]) second = ([a0 a1 .0.] -- a1) swap = (a1 a2 -- a2 a1) @@ -1873,13 +1873,10 @@ conversion function instead. This is programmer's laziness. name: (sequence_to_stack(i), sequence_to_stack(o)) for name, (i, o) in DEFS.iteritems() } - + NEW_DEFS['stack'] = S[0], (S[0], S[0]) + NEW_DEFS['swaack'] = (S[1], S[0]), (S[0], S[1]) globals().update(NEW_DEFS) -.. code:: ipython2 - - stack = S[0], (S[0], S[0]) - .. code:: ipython2 C(stack, uncons) @@ -1984,12 +1981,14 @@ Clunky junk, but it will suffice for now. popop = (a2 a1 --) pred = (n1 -- n2) rest = ([a1 .1.] -- [.1.]) - roll_down = (a1 a2 a3 -- a2 a3 a1) - roll_up = (a1 a2 a3 -- a3 a1 a2) + rolldown = (a1 a2 a3 -- a2 a3 a1) + rollup = (a1 a2 a3 -- a3 a1 a2) rrest = ([a0 a1 .0.] -- [.0.]) second = ([a0 a1 .0.] -- a1) sqrt = (n0 -- n1) + stack = (... -- ... [...]) succ = (n1 -- n2) + swaack = ([.1.] -- [.0.]) swap = (a1 a2 -- a2 a1) swons = ([.0.] a0 -- [a0 .0.]) third = ([a0 a1 a2 .0.] -- a2) @@ -2686,14 +2685,159 @@ as a Joy interpreter stack, and just execute combinators directly. We can hybridize the compostition function with an interpreter to evaluate combinators, compose non-combinator functions, and put type variables on the stack. For combinators like ``branch`` that can have more than one -stack effect we have to "split universes" again and return both. (Note: -bug! If one branch doesn't type check the currect code ignores it, so -you can think things are okay but have a type error waiting in the faled -branch, I think... D'oh! FIXME!!!) +stack effect we have to "split universes" again and return both. .. code:: ipython2 - stack_concat = lambda q, e: (q[0], stack_concat(q[1], e)) if q else e + class FunctionJoyType(AnyJoyType): + + def __init__(self, name, sec, number): + self.name = name + self.stack_effects = sec + self.number = number + + def __add__(self, other): + return self + __radd__ = __add__ + + def __repr__(self): + return self.name + + + class SymbolJoyType(FunctionJoyType): prefix = 'F' + class CombinatorJoyType(FunctionJoyType): prefix = 'C' + + + + +.. code:: ipython2 + + def flatten(g): + return list(chain.from_iterable(g)) + + + ID = S[0], S[0] # Identity function. + + + def infer(e, F=ID): + if not e: + return [F] + + n, e = e + + if isinstance(n, SymbolJoyType): + res = flatten(infer(e, Fn) for Fn in MC([F], n.stack_effects)) + + elif isinstance(n, CombinatorJoyType): + res = [] + for combinator in n.stack_effects: + fi, fo = F + new_fo, ee, _ = combinator(fo, e, {}) + ee = update(FUNCTIONS, ee) # Fix Symbols. + new_F = fi, new_fo + res.extend(infer(ee, new_F)) + else: + lit = s9, (n, s9) + res = flatten(infer(e, Fn) for Fn in MC([F], [lit])) + + return res + + + +.. code:: ipython2 + + f0, f1, f2, f3, f4, f5, f6, f7, f8, f9 = F = map(FloatJoyType, _R) + i0, i1, i2, i3, i4, i5, i6, i7, i8, i9 = I = map(IntJoyType, _R) + n0, n1, n2, n3, n4, n5, n6, n7, n8, n9 = N + s0, s1, s2, s3, s4, s5, s6, s7, s8, s9 = S + +.. code:: ipython2 + + import joy.library + + FNs = '''ccons cons divmod_ dup dupd first + over pm pop popd popdd popop pred + rest rolldown rollup rrest second + sqrt stack succ swaack swap swons + third tuck uncons''' + + FUNCTIONS = { + name: SymbolJoyType(name, [NEW_DEFS[name]], i) + for i, name in enumerate(FNs.strip().split()) + } + FUNCTIONS['sum'] = SymbolJoyType('sum', [(((Ns[1], s1), s0), (n0, s0))], 100) + FUNCTIONS['mul'] = SymbolJoyType('mul', [ + ((i2, (i1, s0)), (i3, s0)), + ((f2, (i1, s0)), (f3, s0)), + ((i2, (f1, s0)), (f3, s0)), + ((f2, (f1, s0)), (f3, s0)), + ], 101) + FUNCTIONS.update({ + combo.__name__: CombinatorJoyType(combo.__name__, [combo], i) + for i, combo in enumerate(( + joy.library.i, + joy.library.dip, + joy.library.dipd, + joy.library.dipdd, + joy.library.dupdip, + joy.library.b, + joy.library.x, + joy.library.infra, + )) + }) + + def branch_true(stack, expression, dictionary): + (then, (else_, (flag, stack))) = stack + return stack, CONCAT(then, expression), dictionary + + def branch_false(stack, expression, dictionary): + (then, (else_, (flag, stack))) = stack + return stack, CONCAT(else_, expression), dictionary + + FUNCTIONS['branch'] = CombinatorJoyType('branch', [branch_true, branch_false], 100) + +.. code:: ipython2 + + globals().update(FUNCTIONS) + +.. code:: ipython2 + + from itertools import chain + from joy.utils.stack import list_to_stack as l2s + +.. code:: ipython2 + + expression = l2s([n1, n2, (mul, s2), (stack, s3), dip, infra, first]) + +.. code:: ipython2 + + expression + + + + +.. parsed-literal:: + + (n1, (n2, ((mul, s2), ((stack, s3), (dip, (infra, (first, ()))))))) + + + +.. code:: ipython2 + + expression = l2s([n1, n2, mul]) + +.. code:: ipython2 + + infer(expression) + + + + +.. parsed-literal:: + + [] + + .. code:: ipython2 @@ -2770,7 +2914,7 @@ For this to work the type label classes have to be modified to let .. code:: ipython2 - F = reduce(C, (pop, swap, roll_down, rest, rest, cons, cons)) + F = reduce(C, (pop, swap, rolldown, rest, rest, cons, cons)) print doc_from_stack_effect(*F) @@ -2780,22 +2924,22 @@ For this to work the type label classes have to be modified to let --------------------------------------------------------------------------- - ValueError Traceback (most recent call last) + TypeError Traceback (most recent call last) - in () - 1 F = reduce(C, (pop, swap, roll_down, rest, rest, cons, cons)) + in () + 1 F = reduce(C, (pop, swap, rolldown, rest, rest, cons, cons)) 2 ----> 3 print doc_from_stack_effect(*F) - in C(f, g) + in C(f, g) 10 def C(f, g): 11 f, g = relabel(f, g) ---> 12 for fg in compose(f, g): 13 yield delabel(fg) - in compose(f, g) + in compose(f, g) 1 def compose(f, g): ----> 2 (f_in, f_out), (g_in, g_out) = f, g 3 s = unify(g_in, f_out) @@ -2803,14 +2947,14 @@ For this to work the type label classes have to be modified to let 5 raise TypeError('Cannot unify %r and %r.' % (f_out, g_in)) - in C(f, g) + in C(f, g) 10 def C(f, g): 11 f, g = relabel(f, g) ---> 12 for fg in compose(f, g): 13 yield delabel(fg) - in compose(f, g) + in compose(f, g) 1 def compose(f, g): ----> 2 (f_in, f_out), (g_in, g_out) = f, g 3 s = unify(g_in, f_out) @@ -2818,14 +2962,14 @@ For this to work the type label classes have to be modified to let 5 raise TypeError('Cannot unify %r and %r.' % (f_out, g_in)) - in C(f, g) + in C(f, g) 10 def C(f, g): 11 f, g = relabel(f, g) ---> 12 for fg in compose(f, g): 13 yield delabel(fg) - in compose(f, g) + in compose(f, g) 1 def compose(f, g): ----> 2 (f_in, f_out), (g_in, g_out) = f, g 3 s = unify(g_in, f_out) @@ -2833,14 +2977,14 @@ For this to work the type label classes have to be modified to let 5 raise TypeError('Cannot unify %r and %r.' % (f_out, g_in)) - in C(f, g) + in C(f, g) 10 def C(f, g): 11 f, g = relabel(f, g) ---> 12 for fg in compose(f, g): 13 yield delabel(fg) - in compose(f, g) + in compose(f, g) 1 def compose(f, g): ----> 2 (f_in, f_out), (g_in, g_out) = f, g 3 s = unify(g_in, f_out) @@ -2848,14 +2992,14 @@ For this to work the type label classes have to be modified to let 5 raise TypeError('Cannot unify %r and %r.' % (f_out, g_in)) - in C(f, g) + in C(f, g) 10 def C(f, g): 11 f, g = relabel(f, g) ---> 12 for fg in compose(f, g): 13 yield delabel(fg) - in compose(f, g) + in compose(f, g) 1 def compose(f, g): ----> 2 (f_in, f_out), (g_in, g_out) = f, g 3 s = unify(g_in, f_out) @@ -2863,7 +3007,22 @@ For this to work the type label classes have to be modified to let 5 raise TypeError('Cannot unify %r and %r.' % (f_out, g_in)) - ValueError: need more than 1 value to unpack + in C(f, g) + 10 def C(f, g): + 11 f, g = relabel(f, g) + ---> 12 for fg in compose(f, g): + 13 yield delabel(fg) + + + in compose(f, g) + 1 def compose(f, g): + ----> 2 (f_in, f_out), (g_in, g_out) = f, g + 3 s = unify(g_in, f_out) + 4 if not s: + 5 raise TypeError('Cannot unify %r and %r.' % (f_out, g_in)) + + + TypeError: 'SymbolJoyType' object is not iterable .. code:: ipython2 diff --git a/docs/sphinx_docs/_build/html/searchindex.js b/docs/sphinx_docs/_build/html/searchindex.js index b1b24e8..3f8d770 100644 --- a/docs/sphinx_docs/_build/html/searchindex.js +++ b/docs/sphinx_docs/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["index","joy","lib","library","notebooks/Categorical","notebooks/Developing","notebooks/Generator_Programs","notebooks/Intro","notebooks/Newton-Raphson","notebooks/NoUpdates","notebooks/Ordered_Binary_Trees","notebooks/Quadratic","notebooks/Recursion_Combinators","notebooks/Replacing","notebooks/Treestep","notebooks/Types","notebooks/Zipper","notebooks/index","parser","pretty","stack"],envversion:52,filenames:["index.rst","joy.rst","lib.rst","library.rst","notebooks/Categorical.rst","notebooks/Developing.rst","notebooks/Generator_Programs.rst","notebooks/Intro.rst","notebooks/Newton-Raphson.rst","notebooks/NoUpdates.rst","notebooks/Ordered_Binary_Trees.rst","notebooks/Quadratic.rst","notebooks/Recursion_Combinators.rst","notebooks/Replacing.rst","notebooks/Treestep.rst","notebooks/Types.rst","notebooks/Zipper.rst","notebooks/index.rst","parser.rst","pretty.rst","stack.rst"],objects:{"joy.joy":{joy:[1,1,1,""],repl:[1,1,1,""],run:[1,1,1,""]},"joy.library":{"void":[3,1,1,""],BinaryBuiltinWrapper:[3,1,1,""],DefinitionWrapper:[3,2,1,""],FunctionWrapper:[3,1,1,""],SimpleFunctionWrapper:[3,1,1,""],UnaryBuiltinWrapper:[3,1,1,""],add_aliases:[3,1,1,""],app1:[3,1,1,""],app2:[3,1,1,""],app3:[3,1,1,""],b:[3,1,1,""],branch:[3,1,1,""],choice:[3,1,1,""],clear:[3,1,1,""],cmp_:[3,1,1,""],concat_:[3,1,1,""],cond:[3,1,1,""],dip:[3,1,1,""],dipd:[3,1,1,""],dipdd:[3,1,1,""],divmod_:[3,1,1,""],drop:[3,1,1,""],dupdip:[3,1,1,""],floor:[3,1,1,""],genrec:[3,1,1,""],getitem:[3,1,1,""],help_:[3,1,1,""],i:[3,1,1,""],id_:[3,1,1,""],ifte:[3,1,1,""],infra:[3,1,1,""],initialize:[3,1,1,""],inscribe:[3,1,1,""],loop:[3,1,1,""],map_:[3,1,1,""],max_:[3,1,1,""],min_:[3,1,1,""],parse:[3,1,1,""],pm:[3,1,1,""],pred:[3,1,1,""],remove:[3,1,1,""],reverse:[3,1,1,""],select:[3,1,1,""],sharing:[3,1,1,""],shunt:[3,1,1,""],sort_:[3,1,1,""],sqrt:[3,1,1,""],step:[3,1,1,""],succ:[3,1,1,""],sum_:[3,1,1,""],swaack:[3,1,1,""],take:[3,1,1,""],times:[3,1,1,""],unique:[3,1,1,""],unstack:[3,1,1,""],warranty:[3,1,1,""],words:[3,1,1,""],x:[3,1,1,""],zip_:[3,1,1,""]},"joy.library.DefinitionWrapper":{add_def:[3,3,1,""],add_definitions:[3,3,1,""],parse_definition:[3,3,1,""]},"joy.parser":{ParseError:[18,4,1,""],Symbol:[18,2,1,""],text_to_expression:[18,1,1,""]},"joy.utils":{generated_library:[3,0,0,"-"],pretty_print:[19,0,0,"-"],stack:[20,0,0,"-"]},"joy.utils.generated_library":{ccons:[3,1,1,""],cons:[3,1,1,""],dup:[3,1,1,""],dupd:[3,1,1,""],dupdd:[3,1,1,""],first:[3,1,1,""],first_two:[3,1,1,""],fourth:[3,1,1,""],over:[3,1,1,""],pop:[3,1,1,""],popd:[3,1,1,""],popdd:[3,1,1,""],popop:[3,1,1,""],popopd:[3,1,1,""],popopdd:[3,1,1,""],rest:[3,1,1,""],rolldown:[3,1,1,""],rollup:[3,1,1,""],rrest:[3,1,1,""],second:[3,1,1,""],stack:[3,1,1,""],stuncons:[3,1,1,""],stununcons:[3,1,1,""],swap:[3,1,1,""],swons:[3,1,1,""],third:[3,1,1,""],tuck:[3,1,1,""],uncons:[3,1,1,""],unswons:[3,1,1,""]},"joy.utils.pretty_print":{TracePrinter:[19,2,1,""]},"joy.utils.pretty_print.TracePrinter":{go:[19,5,1,""],viewer:[19,5,1,""]},"joy.utils.stack":{concat:[20,1,1,""],expression_to_string:[20,1,1,""],iter_stack:[20,1,1,""],list_to_stack:[20,1,1,""],pick:[20,1,1,""],stack_to_string:[20,1,1,""]},joy:{joy:[1,0,0,"-"],library:[3,0,0,"-"],parser:[18,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","classmethod","Python class method"],"4":["py","exception","Python exception"],"5":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:classmethod","4":"py:exception","5":"py:method"},terms:{"0b11100111011011":5,"23rd":15,"4b4cb6ff86e5":15,"5bkei":10,"5eb7ac5ad2c2":15,"\u03b5":8,"abstract":[7,10,17],"boolean":[2,3,7,10],"break":[7,15],"byte":5,"case":[2,3,12,14,15,20],"class":[3,7,15,18,19,20],"default":[3,6,10,20],"export":[3,18],"final":[2,10,12],"float":[3,7,15,16,18],"function":[0,1,4,5,6,9,11,16,17,18,19,20],"g\u00e9rard":16,"import":[2,5,6,8,10,11,12,13,14,15,16],"int":[6,7,12,15,16,18,20],"long":[10,17],"new":[2,3,6,7,9,12,13,15],"p\u00f6ial":17,"p\u00f6ial06typingtool":15,"public":9,"return":[1,3,5,7,10,12,13,14,15,18,19,20],"static":[2,9],"super":15,"switch":[2,15],"throw":10,"true":[2,3,5,12,15],"try":[6,8,11,12,14,15],"void":[0,3],"while":[3,7,10,15,18,20],Adding:[7,13,17],And:[5,6,8,10,12,15,16,20],But:[0,4,5,6,7,10,13,15],CPS:7,For:[2,3,10,12,13,15,17,20],Has:3,Its:3,One:[2,7,15,17],TOS:[2,3],That:[5,10],The:[0,1,2,3,4,6,8,9,11,15,16,17,18,20],Then:[2,3,10,11,12,15],There:[11,12,14,15,20],These:[15,17,20],Use:[3,8,12],Using:[0,8,10,17],With:[8,12,15,17],_1000:15,__add__:15,__class__:15,__eq__:15,__ge__:15,__hash__:15,__init__:15,__main__:15,__radd__:15,__repr__:15,__str__:19,_names_for:15,_to_str:15,_tree_add_:10,_tree_add_e:10,_tree_add_p:10,_tree_add_r:10,_tree_add_t:10,_tree_delete_:10,_tree_delete_clear_stuff:10,_tree_delete_del:10,_tree_delete_r0:10,_tree_delete_r1:10,_tree_delete_rightmost:10,_tree_delete_w:10,_tree_get_:10,_tree_get_p:10,_tree_get_r:10,_tree_get_t:10,_tree_iter_order_curr:10,_tree_iter_order_left:10,_tree_iter_order_r:10,_tree_iter_order_right:10,_tree_t:10,_treestep_0:14,_treestep_1:14,_uniqu:15,_within_b:8,_within_p:8,_within_r:8,a10001:15,a10002:15,a10003:15,a10004:15,a1001:[],abbrevi:14,abil:15,abl:15,about:[0,7,10,15,16,20],abov:[0,5,8,10,12,15],abs:8,absolut:7,accept:[1,2,3,5,6,7,10,11,13,14,15,16],accordingli:10,accumul:5,action:[7,13,15,16],actual:[2,5,7,10,15],adapt:17,add:[3,5,6,7,13,15,19],add_alias:3,add_def:3,add_definit:[3,10,14],added:[4,10],adding:[9,15],addit:[0,2,3,5,7,12,13,14],address:17,adjust:10,after:[5,6,7,12],afterward:7,again:[2,3,5,7,10,12,15],aggreg:16,ahead:15,aka:[7,16],albrecht:0,algorithm:[7,15],alia:3,alias:[3,7],align:[7,19],all:[3,5,6,7,10,12,13,14,15,19],alloc:15,allow:[9,10],almost:10,along:[7,12,15],alphabet:3,alreadi:[8,13,15,16],also:[0,5,7,10,15,20],alter:15,altern:[4,15],although:[4,10,15],altogeth:6,alwai:[5,9,12],amaz:15,among:15,amort:10,analysi:[4,17],anamorph:[7,17],ani:[4,5,7,9,10,15,16,18],annual:7,anonym:10,anoth:[10,15,20],anyhow:15,anyjoytyp:15,anymor:15,anystarjoytyp:15,anyth:[2,3,7,15],api:9,app1:3,app2:[3,7,11,12,13],app3:3,app:7,appear:[2,4,5,10],append:15,appendix:17,appli:[2,3,5,6,10,12,15],applic:6,approach:5,approxim:17,archiv:0,aren:16,arg:[2,3],argument:[2,3,7,8,11,12,17,19,20],arithmet:2,ariti:2,around:[5,15,20],arrang:14,arriv:[6,14],articl:[0,4,6,12],ask:[4,6,15],aspect:0,assert:15,assign:20,associ:10,assum:8,astar:15,asterisk:14,asterix:15,attack:7,attempt:[0,1],attribut:3,attributeerror:15,author:15,auto:0,automat:[4,15],auxiliari:14,avail:[0,15],averag:[7,13],avoid:10,awai:10,awar:2,awkward:[10,12],azur:17,back:[10,15],backward:[9,10,11,14],bag:7,banana:12,barb:12,base:[0,2,3,9,12,14,15],basic:[1,2,3,7,10],becaus:[2,3,7,10,14,15,16,20],becom:[10,14,20],becuas:15,been:[8,9,10,15,16],befor:[6,7,10],begin:[10,14],behavior:[9,14],behaviour:[0,1,15],being:0,below:[2,3,5,6,10,15,16],bespok:7,best:0,better:[5,10,12],between:[0,5],beyond:6,biannual:7,binari:[0,6,7,17],binary_search_tre:10,binarybuiltinwrapp:3,bind:7,bingo:16,bit:[5,6,10,15],block:5,bodi:[2,7,10],body_text:3,booktitl:15,bool:12,borrow:[7,15],both:[2,5,7,11,12,13,15,20],bottom:6,bracket:[7,15,18],branch:[3,5,6,12,15],breakpoint:7,bring:[5,7,15],bruijn:15,brzozowski:15,btree:[10,14],buck:10,bug:[0,7,15],build:[6,7,11,12,15,16,20],built:[11,15],bundl:[2,3,12],burgeon:7,calculu:4,call:[2,7,9,10,12,15,19,20],caller:10,can:[0,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,20],cannot:15,captur:7,card:7,care:[5,20],carefulli:16,carri:[6,10],cartesian:4,catamorph:17,categor:[0,17],categori:4,ccc:4,ccon:[3,10,15],cell:[12,15],certain:[7,20],certainli:10,chain:3,chang:[2,9,10,15,16],charact:16,chat:7,chatter:[0,15],check:[6,8,15],child:14,choic:[3,12],choos:9,chop:11,cinf:10,circuit:4,cite_not:10,classmethod:3,claus:[3,15],clean:15,clear:[3,5,7],clear_stuff:10,cleav:[7,11,13],close:[0,1,4],clunki:[5,15],cmp:[3,14,17],cmp_:3,code:[0,1,4,11,12,15,17],codireco:[6,8],collaps:12,collect:[4,6,7,15],combin:[0,3,5,6,7,8,11,14,16,17],combinatorjoytyp:15,come:[7,10,15],command:[7,10,15],common:[2,5],compar:[3,4,15],comparison:[0,10],compel:4,compil:[2,4,7,10,13,17],complet:[4,15],complex:[3,15,16],complic:15,composit:15,compostit:15,compound:10,comput:[2,4,5,7,11,15],con:[3,5,6,7,8,10,11,12,14,16,20],conal:4,concat:[3,6,7,14,20],concat_:3,concaten:0,concatin:[0,3,20],conclus:17,concurr:2,cond:[3,10],condit:[3,7],confer:15,conflict:[10,15],conjectur:15,consecut:17,consid:[5,6,10,12,14,15,16],consist:[2,6,7,14],constant:10,constitu:12,constraint:15,construct:15,consum:15,contain:[0,2,3,6,7,12,15],content:15,context:2,conting:10,continu:[0,12,15,16],control:7,conveni:[4,15],convers:15,convert:[12,13,14,15,18,20],cool:10,copi:[2,3,5,10,12,14,17],copyright:7,correct:15,correspond:4,could:[2,4,5,7,9,10,15,16],count:[3,15],counter:[5,15],coupl:14,cours:[5,10,15],cover:15,crack:10,crap:15,crash:10,creat:[0,2,3,5,8,10,15],creativ:15,crude:[10,15,18],currect:15,current:[2,3,7,12,14,15,16,19],custom:9,cycl:[5,6],cython:7,dai:7,data:[2,3,12],datastructur:[0,2,12,15,17,18,20],datatyp:20,ddee30dbb1a6:15,ddididi:16,deal:[0,10],dealt:15,decid:10,declar:15,decor:3,decoupl:12,decrement:3,deduc:[5,15],deeper:0,deepli:4,def:[3,7,12,13,15,20],defaultdict:15,defi:3,defin:[2,3,4,5,6,7,8,9,11,12,13,15,16,17],definit:[2,3,5,6,7,9,10,12,14,15,17],definitionwrapp:[3,10,12,14],deleg:7,delet:17,deliber:15,demonstr:4,depend:[3,10,12],deposit:14,depth:15,dequot:12,der:10,deriv:[2,3,5,7,8,10,15,17],describ:[3,4,10,12,14,15,18],descript:[5,7],descriptor:15,design:[2,3,10,17],desir:[7,14],destruct:10,detail:[7,10,15],detect:[6,10,12,15],determin:17,develop:[0,6,7,15,17],diagram:5,dialect:1,dict:[1,3,15],dictionari:[0,1,3,7,15,17],differ:[0,4,5,8,10,11,12,20],differenti:4,difficult:15,dig:[10,16],digit:5,dinfrirst:7,dip:[3,5,6,7,8,10,11,12,13,14,15,17],dip_a:15,dip_t:15,dipd:[3,6,7,10,11,12,15,16],dipdd:[3,10],direco:17,direct:7,directli:[5,14,15,20],disappear:[2,15],discard:[3,6,8,10,12],disciplin:10,disenstacken:7,disk:7,displac:2,displai:15,distiguish:15,ditch:10,div:[3,7],dive:14,divis:10,divmod:3,divmod_:[3,15],doc:[2,3,7,15],document:[17,18,20],doe:[0,1,4,6,7,13,17,19],doesn:[5,9,10,14,15,20],doing:[4,5,7,15,16],domain:[4,15],don:[5,7,10,15],done:[2,5,7,9,15],door:7,dot:19,doubl:[5,7,15],down:[2,8,12,15,16],down_to_zero:7,dozen:7,draft:[4,9],dream:7,drive:[6,8],driven:5,driver:6,drop:[3,10],dudipd:7,due:15,dup:[3,5,6,7,8,10,11,12,16,20],dupd:[3,15],dupdd:3,dupdip:[3,5,10,11,12],duplic:[3,10,12],durat:2,dure:[2,12],each:[2,3,4,5,7,12,13,14,15,19],easi:[0,10,14,15,16],easier:[3,10],easili:4,edit:17,effect:[2,3,7,16,17],effici:[6,13,16],either:[1,2,3,10,12,15],elabor:15,eleg:[7,10,15],element:2,elif:15,elimin:15,elliott:4,els:[2,3,12,15],embed:[4,10,16],emit:15,empti:[3,7,14,15,20],encapsul:7,enclos:7,encod:6,encount:15,end:[5,10,12,14,15,20],endless:6,enforc:[2,7],engend:7,enorm:15,enough:[7,12,15,19],enstacken:[6,7,15],enter:7,entir:20,entri:[3,16,19],enumer:15,epsilon:8,equal:[5,14,20],equat:[7,8],ergo:10,err:10,error:[7,15,18],essai:0,establish:15,etc:[3,14,15,16,18],euler:17,euro:15,eval:[0,15],evalu:[1,2,3,7,8,10,11,12,13,14,15],event:15,eventu:15,everi:[6,15],everyth:[3,10,11,15],evolv:9,examin:12,exampl:[0,3,5,15,17,18,20],exce:6,except:[7,10,15,18],execut:[0,1,2,3,7,12,13,14,15,16,20],exend:15,exercis:10,exist:[4,10,15],expand:10,expect:[2,3,14,15,20],experi:[7,14],explain:15,explan:7,explor:7,express:[0,1,2,3,4,10,12,13,15,16,19,20],expression_to_str:20,extend:15,extra:[5,6],extract:[10,11,17],extrem:7,extrememli:7,f1001:[],f_g:15,f_in:15,f_out:15,f_python:15,facet:0,facil:7,fact:18,factor:[2,5,7,10,15],factori:17,fail:[2,3,10,18],fairli:15,fale:15,fals:[2,3,5,12,15],far:[8,10,12,15],fascin:0,fear:[10,15],few:[5,7,8,11],fewer:[3,7],fg_in:15,fg_out:15,fib:6,fib_gen:6,fibonacci:17,figur:[2,3,10,12],filter:10,fin:5,find:[2,3,5,6,14,15,17],finder:8,fine:[0,5,10,15],first:[3,6,7,8,10,11,12,13,14,16,17],first_two:[3,10],fit:[5,7],five:[5,7,17],fix:[2,3,12],fixm:15,flatten:[7,14],flexibl:17,floatjoytyp:15,floatstarjoytyp:15,floor:3,floordiv:5,flow:7,follow:[0,2,3,7,9,12,14,15,16],foo:[7,9,10,15],foo_ii:9,form:[2,3,4,5,6,12,14,15,20],forman:7,format:[15,17,19],formula:[0,5,17],forth:[7,15],forum:0,forward:15,found:7,foundat:15,four:[2,3,5,6,7,10,17],fourteen:5,fourth:[2,3,10,12],fractal:7,fraction0:7,fraction:[2,7],frame:12,framework:7,free:[4,7,10],freeli:2,from:[0,1,2,3,5,6,7,8,10,11,12,13,14,15,16,17,20],front:[2,3,12],full:5,fulli:15,fun:17,func:15,functionwrapp:3,funtion:10,further:[8,15,17],g_in:15,g_out:15,garbag:7,gari:10,gcd:7,gener:[0,2,4,12,15,17,20],generated_librari:3,genrec:[3,7,10,12,14],geometr:5,get:[2,4,5,6,7,11,12,15,17],getitem:3,getrecursionlimit:20,getsourc:7,ghc:4,give:[4,5,10,12,14,15,20],given:[2,3,5,6,8,10,12,15,16,17],global:15,glue:7,going:[10,11,14,15,16],good:[5,10],grab:[3,15],grammar:18,grand:7,great:[0,7,15,17],greater:20,grok:15,group:0,gsra:8,guard:10,had:[5,15,16],haiku:7,half:[5,15,16],hand:[7,13,15,17],handi:[8,15],handl:[10,15,20],happen:[7,15],hard:[15,16],hardwar:4,has:[0,2,6,7,8,9,10,12,15,16,20],hash:15,haskel:4,have:[2,3,5,6,7,8,9,12,13,15,16,17,20],haven:15,head:20,help:[7,10,12,15],help_:3,helper:3,herd:7,here:[5,6,10,14,15,16],hide:10,hierarchi:15,higher:[7,10],highli:7,histori:[15,19],hmm:10,hoist:3,hold:[5,15],hood:10,hope:[0,5,7,15,17],hopefulli:12,host:17,how:[0,4,8,10,12,15,16,17],howev:[12,13,15],html:[2,3,6,11,12,17],http:10,huet:16,huge:10,hugh:[8,14],human:7,hybrid:15,hylomorph:17,hypothet:2,id_:3,idea:[4,5,7,15],ident:[3,12],if_not_empti:10,ift:[3,10,12,14,15],ignor:[3,10,15],iii:17,illustr:12,imagin:16,imap:15,imit:14,immedi:12,immut:[7,10],imper:12,implement:[0,1,2,3,4,7,9,10,12,13,17],impli:15,implicit:7,includ:[4,10,14,15],inclus:5,incom:20,incompat:9,incorpor:11,increas:5,increment:[3,4,5,9],index:[0,7,15,20],indexerror:20,indic:[14,15],ineffici:15,infer:[0,17],inform:[3,15],infra:[3,6,7,10,11,13,14,17],infrastructur:3,initi:[2,3,7,8,10],inlin:10,inner:15,inproceed:15,input:[1,8,15],inscrib:3,insert:15,insight:12,inspect:7,instal:0,instanti:[4,19],instead:[5,6,10,12,15,16,20],integ:[2,3,7,12,14,15],integr:3,intend:[0,7],interact:[7,17],interest:[0,5,10,15,17],interlud:17,intermedi:12,intern:[0,15,19,20],interpret:[0,4,9,13,17,18,19],interrupt:7,interv:[4,5],intjoytyp:15,introduc:9,introduct:0,intstarjoytyp:15,intuit:15,invari:3,invent:15,involv:15,ipf:7,ipython:15,isinst:15,isn:[10,16],issubclass:15,item:[2,3,7,10,12,14,15,17,20],iter:[1,3,7,12,14,15,17,20],iter_stack:[13,15,20],iteritem:15,itertool:15,its:[0,2,3,4,5,7,10,12,14,15,20],itself:[0,2,7,10,15],j05cmp:[2,3,12],jaanu:15,job:17,john:[8,14],joi:[2,4,9,10,11,13],join:15,joypi:[7,16],june:15,junk:17,jupyt:17,just:[0,2,3,6,7,9,10,12,14,15,16],kav:15,keep:[10,11,15,16],kei:[14,17],kevin:0,key_n:10,keyerror:[10,15],kind:[2,4,7,10,12,14,15],kinda:15,kjs:15,kleen:[14,15],kleenestar:15,kleffner:15,know:[5,10,15],knowledg:15,known:4,l_kei:10,l_left:10,l_right:10,l_valu:10,label:15,lambda:[4,15],languag:[4,7,9,10,13,15],larg:15,larger:20,largest:3,last:[5,10,12,15],lastli:6,later:[7,14,15],law:[2,15],lazi:15,lazili:8,lcm:5,lead:[7,15],leaf:10,lean:7,learn:0,least:[2,5,12,15,20],least_fract:7,leav:5,left:[7,11,12,14,15,16,19,20],leftov:12,len:15,length:[3,5,20],lens:12,less:[5,6,7,12,15,20],let:[6,8,10,11,12,14,15,16],letter:15,level:[4,10],librari:[0,13],like:[2,3,5,7,14,15,17,18],limit:15,line:[3,7,10,11,19],linear:20,link:0,linux:0,list:[0,3,5,7,8,10,12,14,16,19],list_to_stack:20,lit:15,liter:[1,10,14,15,16,18],literatur:15,littl:[6,10,15,17],live:17,lkei:14,load:[5,7],local:15,locat:2,locu:19,lof:15,log_2:10,logic:[0,5,17],longer:[10,15],look:[6,7,8,10,11,15],lookup:7,loop:[0,1,3,5],lose:15,lot:[7,10,16],love:5,low:4,lower:5,lowercas:15,lowest:10,machin:0,machineri:[10,15],macro:7,made:[0,7,15,16],magic:15,mai:[2,12,15],mail:0,main:[0,3,7,11,15,16],mainloop:9,maintain:16,major:9,make:[2,3,4,5,7,10,12,13,14,15,16,17],make_gener:8,manfr:[0,2,3,4,12],mani:[0,7,15],manipul:15,manner:11,map:[1,3,5,7,9,12,14,15],map_:3,marker:7,mask:[5,6],match:[0,1],materi:[0,15],math:[0,7,8,10,11,15],mathemat:7,matter:[5,8,10,14],max_:3,maximum:3,mayb:10,mean:[4,5,7,8,10,12,14,15,20],meant:[7,10,12,14],member:[2,3,12],mental:[7,15],mention:2,mercuri:0,mess:15,meta:[7,10,13],meta_compos:15,metal:15,method:[0,3,7,15,17,19],midpoint:5,might:[4,6,10,15],mike:10,million:6,min_:3,mind:15,minimum:3,minor:10,minu:3,mirror:0,miscellan:0,mix:[7,15],mod:3,mode:15,model:[4,7,15],modern:0,modif:6,modifi:[7,10,16],modul:[0,1,3,7,15,18],modulu:7,moment:15,month:7,more:[0,3,4,5,6,7,8,12,13,14,15,18,20],most:15,mostli:0,motiv:15,move:10,movement:2,much:[5,6,10,12,15],muck:10,mul:[7,11,16,19],multi:3,multipl:17,must:[2,3,5,9,12,14,15],myself:15,n10001:15,n10002:15,n10003:15,n1001:15,n1002:15,n1003:15,name:[1,3,7,9,10,12,15,16,17,18,20],natur:[5,6,10],navig:16,nearli:15,neat:10,neato:15,necessarili:15,need:[2,3,5,6,8,9,10,12,15],neg:[3,11],nest:[3,7,10,16],network:7,never:[9,12],new_def:15,new_f:15,new_kei:10,new_valu:10,newton:[0,17],next:[5,14,15],nice:[0,12,20],niether:2,node:[14,17],node_kei:10,node_valu:10,non:[14,15],none:[1,3,15],nope:14,notat:[7,10],note:[2,5,8,10,12,15,20],notebook:[5,6,7,15,16,17],notebook_preambl:[2,5,6,8,10,11,12,13,14,15,16],noth:[2,10],notic:5,now:[5,6,7,12,13,14,15,17],nth:[3,20],nullari:[7,10],number:[1,2,3,5,6,8,20],numberjoytyp:15,numberstarjoytyp:15,numer:15,object:[15,18],observ:5,obviou:6,obvious:15,occur:10,odd:[5,6],off:[2,3,5,6,11,16],okai:15,old:[2,13],old_k:10,old_kei:10,old_valu:10,omit:[12,15],onc:[3,9,10],one:[2,3,5,6,10,12,14,15,19,20],ones:[6,15],onli:[2,3,5,10,12,15,16,20],onto:[1,2,3,7,12,20],open:[7,15],oper:[3,7,10,12,15,20],oppos:15,optim:10,option:[1,7,10,20],order:[0,2,3,7,12,15,17,20],org:[0,10],origin:[0,1,2,3,10,15,16],other:[0,2,3,4,7,10,12,14,15,20],otherwis:[3,5,6,10,14,15],our:[5,6,7,8,12,14,15],out:[2,3,4,5,6,7,8,10,11,12,15,16],outcom:14,output:[8,12,15],outsid:4,over:[3,4,5,6,7,8,10,11,14,15,17],overhaul:15,overview:15,own:[10,15],pace:15,pack:20,packag:[0,7],page:[0,10,15,20],pair:[2,3,5,6,10,15],palidrom:5,palindrom:5,pam:7,paper:[4,7,12,16],paradigm:17,parallel:2,paramet:[1,2,3,12,13,18,19,20],parameter:17,paramorph:12,parenthes:[10,20],pariti:6,pars:[0,3,7],parse_definit:3,parseerror:18,parser:[0,15],part:[2,3,8,12,14,17],partial:15,particular:16,pass:[0,10,15,19],path:17,pattern:[5,14,17],pe1:[5,6],pe2:6,pearl:16,pend:[3,7,12,16,19],peopl:17,per:[7,14],perform:15,perhap:6,period:7,permit:[15,20],permut:15,persist:10,phase:2,pick:[5,6,20],pickl:7,pictur:10,piec:12,pip:0,place:[3,5,7,15],plai:0,plu:3,plug:[6,12,14],point:[4,7,10,12],pointless:2,pop:[3,5,6,7,10,12,13,14,20],popd:[3,7,8,10,13,15],popdd:[3,6,11,15],popop:[3,5,6,7,8,10,14,15],popopd:3,popopdd:3,posit:[3,5,7,12],possibilit:10,possibl:[10,14,15,17],post:7,poswrd:15,power:7,pragmat:5,preambl:8,precis:[0,1],pred:[3,15],predic:[2,3,6,12],prefix:[15,19],present:15,preserv:[4,14],pretti:[8,10,11,14,15,19,20],pretty_print:0,previou:7,primari:15,prime:8,primit:[2,3,15,17],primrec:[3,6,7,8,12],principl:15,print:[0,1,2,3,15,19,20],probabl:[6,7,10,15],problem:[7,15,17],proc_curr:10,proc_left:10,proc_right:10,proce:5,process:[7,14,15,19],produc:[5,10,12,14,15],product:[6,7,15],program:[0,2,3,6,7,8,10,12,15,16],programm:15,progress:15,project:17,prompt:7,proper:[2,3,12],properti:0,provabl:15,proven:15,provid:[0,3,4,7,15],pun:[0,7],punctuat:15,pure:0,puriti:7,purpos:7,push:[2,3,7,12,16,20],pushback:7,put:[1,2,6,7,15,17,20],pypi:0,python:[0,2,3,10,12,16,17,18,20],quadrat:[0,17],queri:[10,14],query_kei:14,queu:12,quit:[0,1,14],quot:[0,3,6,7,10,11,12,14,15,16,19],quotat:[2,3,12],quotient:3,r_kei:10,r_left:10,r_right:10,r_valu:10,rais:[10,15,18,20],rang:[7,15],range_revers:12,range_to_zero:7,ranger:12,ranger_revers:12,raphson:8,rather:[5,7,12,14],ratio:7,reach:[5,6,12],read:[0,1,5,6,10,15,16],readabl:13,reader:10,readi:15,real:10,realiz:[4,10],rearrang:[2,10,15],reason:[5,7,15],rebuild:[14,16],rec1:[2,3,12],rec2:[2,3,12],recent:15,recogn:18,record:[7,19],recur:[12,15],recurs:[0,2,3,6,7,8,15,17,20],recus:7,recycl:15,redefin:17,redistribut:[3,7],reduc:[2,15],redund:20,refactor:[7,9],refer:[0,2],regist:2,regular:[15,18],reimplement:17,relat:15,releas:9,remain:[2,7,9],remaind:[3,8],remind:15,remov:[3,10,15,20],render:17,repeat:5,repeatedli:5,repl:[0,1],replac:[0,2,3,6,11,12,14,15,16,17,20],repositori:0,repr:15,repres:[2,7,10,18,19],represent:20,reprod:6,repurpos:15,requir:[15,20],res:15,research:15,resembl:7,respect:5,rest:[3,5,6,7,10,12,16,17,20],rest_two:10,restat:15,restor:2,restrict:15,result:[1,2,3,5,10,11,12,14,15,16],resum:7,retain:15,retir:2,retri:7,reus:[10,15],revers:[3,5,6,12,15,16,20],revisit:15,rewrit:[3,7,15],rewritten:7,rich:15,rid:10,right:[6,7,11,14,15,17,19,20],rightest:10,rightmost:5,rkei:14,rob:15,robot:15,roll:[3,8,10,14],roll_dn:15,roll_down:15,roll_up:15,rolldown:3,rollup:3,root:[3,8,11],round:15,rrest:[3,15],rule:17,run:[0,1,3,5,7,8,10,11,12,14,16],runtimeerror:20,s1000:[],s1002:[],s23:[],sai:[6,10,11,14,15],same:[2,4,5,10,15,20],sandwich:[2,3,12],save:[2,5,7],scan:3,scanner:[7,18],scenario:16,scope:[6,10],search:[0,10],sec:15,second:[3,7,10,12,14,20],section:12,see:[0,6,7,8,9,11,12,13,15,16,19],seem:[0,5,7,14,15],seen:[15,16],select:3,self:15,semant:[2,3,7,9,10,15],semi:7,send:7,sens:[0,2,5,15,16],separ:[7,15],seq:15,sequenc:[0,1,2,3,5,7,10,12,13,16,17,18],sequence_to_stack:15,seri:[5,6,10,16],ses:15,set:[2,3,12,15,17],seven:[5,6],sever:[0,4,7,12],share:[3,7],shelf:2,shift:[5,6],shorter:17,shorthand:10,should:[2,3,5,10,12,15],shouldn:7,show:[4,16],shunt:[3,16],side:[10,15],signifi:[7,10],similar:[10,14,15],simon:7,simpl:[7,12,15,20],simplefunctionwrapp:[3,13,15],simpler:14,simplest:[15,17],simpli:4,simplifi:[5,10,16],sinc:[2,5,10,15],singl:[3,6,7,13,15,18],situ:10,situat:10,six:[5,6,7],sixti:[5,6],size:[7,17],skeptic:7,skip:15,slight:8,slightli:[10,12,15],smallest:3,smart:[10,15],softwar:[7,15],solei:2,solut:[5,6],solvabl:7,some:[2,3,6,7,10,12,14,15,17,20],somehow:[10,15],someth:[2,9,10,15],sometim:10,somewher:[10,17],sort:[3,10,15],sort_:3,sorta:15,sourc:[0,1,3,15,17,18,19,20],space:[5,19],span:5,spawn:15,special:[6,10,15,17],specif:[0,4],specifi:[10,15],speed:13,spell:14,sphinx:[17,20],spirit:[0,1,14],split:15,sqr:[7,8,11,16],sqrt:[3,8,15],squar:[3,8,15,18],stack:[0,1,3,5,6,8,10,11,12,13,14,16,17,18,19],stack_concat:15,stack_effect:15,stack_effect_com:15,stack_to_str:20,stacki:15,stackjoytyp:15,stackstarjoytyp:15,stage:14,stai:[0,1],stand:4,standard:[7,10],star:[14,15],stare:10,start:[5,6,7,8,10,12,14,15],state:7,statement:3,step:[3,5,7,10,13,15,16,17],still:[10,15],stop:10,storag:[5,10],store:[5,12],stori:12,str:[1,15,18,19,20],straightforward:[1,6,8,15,17],stream:5,stretch:10,string:[1,2,3,7,15,16,18,19,20],structur:[7,14,15,16,17,20],stuff:[10,15],stuncon:3,stununcon:3,style:[0,4,15],sub:9,subclass:7,subject:16,subset:15,substitut:[10,15],subtract:5,subtyp:17,succ:[3,15],succe:15,success:8,suffic:15,suffici:10,suffix:15,suggest:[4,10],suitabl:[3,4,5],sum:[3,6,7,11,12,13,14],sum_:[3,15],summand:5,sumtre:14,suppli:[10,18],support:[7,15,19,20],suspect:2,swaack:[3,11,13,16],swap:[3,5,6,7,8,10,12,13,14,16],swarm:15,swon:[3,6,7,12,14,15,16],swoncat:[6,7,8,12,14],swuncon:12,symbol:[2,3,15,16,17,18],symboljoytyp:15,symmetr:[5,10],syntact:7,syntax:[7,20],sys:20,system:[7,10,15],tabl:15,tag:15,tail:[10,15,17,20],take:[3,5,7,8,10,12,15,20],talk:[7,10,15,20],target:16,tast:4,tbd:7,tear:12,technic:2,techniqu:[4,16],technolog:2,temporari:16,ten:5,term:[1,2,7,8,12,15,17,18,20],termin:[2,3,12],ternari:7,test:[2,3,12],text:[0,1,3,15],text_to_express:[7,15,18],textual:7,than:[0,3,5,6,7,8,12,14,15,20],thei:[2,5,6,7,10,12,15,16,18,20],them:[2,3,5,6,10,12,15,16,17],themselv:15,theori:[2,3,12],therefor:[6,15],thi:[0,1,2,3,4,5,6,7,8,11,12,14,15,16,17,18,19,20],thing:[2,6,10,12,15,16,18,20],think:[2,5,7,10,12,14,15],third:[3,6,7,10],thirti:5,those:[2,3,10,12,15,17],though:5,thought:7,thousand:5,thread:2,three:[2,3,5,7,10,11,14,15,17],through:[1,5,7,14,15,16,20],thun:[2,3,4,9,12],thunder:7,time:[3,5,7,8,10,12,15,16],titl:15,to_set:10,todai:7,todo:[7,18],togeth:[6,7,15,17],token:18,toler:17,too:[12,15],tool:[7,15],tooo:15,top:[2,3,7,12,15,19,20],total:5,tower:15,trace:[0,7,11,12,16,17,20],traceback:15,traceprint:19,track:[11,15,16],tracker:0,transform:4,translat:[4,11,15],trash:15,travers:[0,17],treasur:0,treat:[0,2,3,12,15,17],treatment:6,tree:[0,7,17],treegrind:17,treestep:[0,17],tri:5,triangular_numb:12,trick:[5,15],tricki:15,trobe:0,trove:0,truli:15,trust:15,truthi:[3,7],tuck:[3,7,15],tupl:[3,7,15,20],ture:15,turn:[2,3,15],twice:[10,12],two:[2,3,5,7,8,10,11,12,14,15,16,17,20],type:[0,1,4,7,10,12,17,18,19,20],typeerror:15,typeless:15,typic:[2,3,11,12],unari:7,unarybuiltinwrapp:3,unbalanc:[10,18],unchang:10,uncompil:15,uncon:[3,6,7,10,12,14,16],under:[2,3,7,10],underli:15,underscor:15,understand:[0,10,15],undistinguish:10,undocu:7,unend:15,unfinish:15,unfortun:20,unif:15,uniqu:[3,10,15],unit:[7,12],univers:[0,7,15],unnecessari:17,unnecesssari:15,unpack:[2,3,10,15,20],unpair:5,unquot:[7,14],unstack:[3,15],unswon:3,untangl:12,until:6,unus:5,unusu:10,updat:[0,17],usag:7,use:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,20],used:[3,4,7,10,12,16,18,20],useful:[0,15],user:14,uses:[2,5,12],using:[3,6,10,11,12,14,16],usual:[0,2,12],util:[0,3,13,15],valid:15,valu:[0,2,3,5,7,8,11,12,13,14,15,17,20],value_n:10,valueerror:[15,20],variabl:[15,17],variant:10,variat:[12,17],varieti:[4,7],variou:0,vener:20,verbos:4,veri:[0,1,4,7,10,20],verifi:15,versa:[2,15],version:[0,1,2,6,9,14,16,17],via:7,vice:[2,15],view:[10,17],viewer:[1,7,9,19],vii:17,von:[0,2,3,4,12],wai:[0,2,3,4,5,7,12,13,15],wait:15,want:[2,5,6,8,10,12,15],warranti:[3,7],wash:7,wast:7,web:20,websit:[0,5],welcom:7,well:[0,4,7,8,10,15,18],were:[7,15,16],what:[2,3,4,7,10,12,14,15,19],whatev:[2,3,12,14,20],when:[5,6,7,10,12,15,16,18,20],where:[2,3,7,10,12,15,17,20],whether:12,which:[0,1,3,5,7,8,10,12,14,15,16,20],whole:[2,3,5,12,14,15],whose:6,why:[8,14],wiki:10,wikipedia:[0,10,16],wildli:7,wind:7,wire:12,within:[7,10,13,17],without:[2,7,10,11,15],won:[10,15,20],word:[0,3,5,7,12,16],work:[0,3,5,6,7,8,10,11,12,14,15,16,20],worth:5,would:[2,5,6,7,8,10,12,15,16,20],wrap:[3,7],wrapper:15,write:[4,8,10,12,14,15,16,17,20],written:[0,1,8,10,13,15,20],wrong:2,wrote:15,xrang:15,yang:15,year:[7,15],yet:[10,15,16],yield:[2,3,12,15,20],yin:17,you:[0,2,3,5,6,7,9,10,11,12,13,14,15,16,19,20],your:[2,3,7,12,15],yourself:[7,10],zero:[3,10,12,14,15,18,20],zip:[5,15],zip_:3,zipper:[0,17],zstr:16},titles:["Thun 0.2.0 Documentation","Joy Interpreter","Functions Grouped by, er, Function with Examples","Function Reference","Categorical Programming","Developing a Program in Joy","Using x to Generate Values","Thun: Joy in Python","Newton\u2019s method","No Updates","Treating Trees I: Ordered Binary Trees","Quadratic formula","Recursive Combinators","Replacing Functions in the Dictionary","Treating Trees II: treestep","Type Inference","Traversing Datastructures with Zippers","Essays about Programming in Joy","Parsing Text into Joy Expressions","Tracing Joy Execution","Stack or Quote or Sequence or List\u2026"],titleterms:{"abstract":15,"case":[8,10],"function":[2,3,7,8,10,12,13,14,15],"long":13,"new":10,"p\u00f6ial":15,"void":2,"while":2,Adding:10,One:[6,10],The:[5,7,10,12,14],There:7,Using:6,With:14,about:17,add:[2,10],adding:10,address:16,altern:14,ana:12,analysi:5,anamorph:[2,12],app1:2,app2:2,app3:2,appendix:[10,12,15],approxim:8,argument:15,auto:3,averag:2,base:[8,10],binari:[2,10,14],both:10,branch:[2,10],can:10,cata:12,catamorph:12,categor:4,chatter:2,child:10,choic:2,clear:2,cleav:2,cmp:10,code:[7,10],combin:[2,10,12,15],comment:15,compar:10,comparison:2,compil:[6,15],compile_:15,compos:15,comput:8,con:[2,15],concat:[2,15],conclus:12,consecut:8,continu:7,current:10,datastructur:[7,10,16],deal:15,defin:[10,14],definit:11,delabel:15,delet:10,deriv:[11,12,14],design:12,determin:16,develop:5,dialect:0,dictionari:13,dip:[2,16],dipd:2,dipdd:2,direco:6,disenstacken:2,distinguish:15,div:2,doc_from_stack_effect:15,document:0,doe:10,down_to_zero:2,drop:2,dup:[2,15],dupd:2,dupdip:2,effect:15,els:10,empti:10,enstacken:2,equal:10,essai:17,euler:[5,6],eval:7,even:6,exampl:[2,7,10,12,14],execut:19,express:[7,18],extract:14,factori:12,fibonacci:6,filter:5,find:[8,10,12],first:[2,5,15],five:6,flatten:2,flexibl:14,floordiv:2,formula:11,found:10,four:12,fun:12,further:5,gcd:2,gener:[3,5,6,8],genrec:2,get:[10,14],getitem:2,given:14,greater:10,group:2,have:[10,14],help:2,highest:10,host:0,how:[5,6],hylo:12,hylomorph:12,identifi:15,ift:2,iii:15,implement:15,indic:0,infer:15,inferenc:15,inform:0,infra:[2,16],integ:5,interest:6,interlud:10,intern:18,interpret:[1,7,15],item:16,iter:[5,10],joi:[0,1,3,5,7,12,15,16,17,18,19,20],junk:15,just:5,kei:10,languag:0,least_fract:2,left:10,less:10,let:5,librari:[3,7,15],like:10,list:[2,15,20],literari:7,littl:5,logic:[2,15],loop:[2,7],lower:10,lshift:2,make:[6,8],mani:5,map:2,math:2,method:8,min:2,miscellan:2,mod:2,modifi:15,modulu:2,more:10,most:10,mul:[2,15],multipl:[5,6,15],must:10,name:11,neg:2,newton:8,next:8,node:10,non:10,now:10,nullari:2,number:[12,15],one:7,onli:7,order:[10,14],osdn:0,our:10,over:2,pack:5,pam:2,para:12,paradigm:15,parameter:[10,14],pars:[2,18],parser:[7,18],part:15,pass:7,path:16,pattern:12,per:10,pop:[2,15],popd:2,popop:2,pow:2,power:6,pred:2,predic:[5,8,10,14],pretty_print:19,primit:12,primrec:2,print:7,problem:[5,6],process:10,product:2,program:[4,5,11,14,17],project:[0,5,6],pure:7,put:[10,11,14],python:[7,13,15],quadrat:11,quick:0,quot:[2,20],rang:[2,5,12],range_to_zero:2,read:7,recur:[8,10],recurs:[10,12,14],redefin:[10,14],refactor:[5,10],refer:3,regular:7,reimplement:14,relabel:15,rem:2,remaind:2,remov:2,render:5,repl:7,replac:[10,13],repres:15,reset:6,rest:[2,15],revers:2,right:[10,16],rightmost:10,roll:[2,15],rolldown:2,rollup:2,rshift:2,rule:15,run:[2,6],second:[2,15],select:2,sequenc:[6,15,20],set:[8,10],shorter:13,should:7,shunt:2,simplest:5,size:[2,13],someth:[],sourc:10,special:12,sqr:[2,15],sqrt:[2,11],stack:[2,7,15,20],start:0,step:[2,12,14],straightforward:11,structur:10,style:7,sub:[2,10],subtyp:15,succ:2,sum:[2,5],swaack:2,swap:[2,15],swon:2,swoncat:2,symbol:[7,12],tabl:0,tail:12,take:2,term:[5,6,14],ternari:2,text:18,than:10,them:11,thi:10,third:[2,15],three:6,thun:[0,7],time:[2,6],togeth:[10,11,14],token:7,toler:8,trace:[13,19],traceprint:7,travers:[10,14,16],treat:[10,14],tree:[10,14,16],treegrind:14,treestep:14,triangular:12,truediv:2,truthi:2,tuck:2,two:6,type:15,unari:2,unbound:15,uncon:[2,15],unifi:15,unit:2,unnecessari:5,unquot:2,unstack:2,updat:[9,15],use:15,util:[19,20],valu:[6,10],variabl:11,variat:6,version:[5,10,13,15],view:7,vii:15,within:8,word:2,write:11,xor:2,yin:15,zero:6,zip:2,zipper:16}}) \ No newline at end of file +Search.setIndex({docnames:["index","joy","lib","library","notebooks/Categorical","notebooks/Developing","notebooks/Generator_Programs","notebooks/Intro","notebooks/Newton-Raphson","notebooks/NoUpdates","notebooks/Ordered_Binary_Trees","notebooks/Quadratic","notebooks/Recursion_Combinators","notebooks/Replacing","notebooks/Treestep","notebooks/Types","notebooks/Zipper","notebooks/index","parser","pretty","stack"],envversion:52,filenames:["index.rst","joy.rst","lib.rst","library.rst","notebooks/Categorical.rst","notebooks/Developing.rst","notebooks/Generator_Programs.rst","notebooks/Intro.rst","notebooks/Newton-Raphson.rst","notebooks/NoUpdates.rst","notebooks/Ordered_Binary_Trees.rst","notebooks/Quadratic.rst","notebooks/Recursion_Combinators.rst","notebooks/Replacing.rst","notebooks/Treestep.rst","notebooks/Types.rst","notebooks/Zipper.rst","notebooks/index.rst","parser.rst","pretty.rst","stack.rst"],objects:{"joy.joy":{joy:[1,1,1,""],repl:[1,1,1,""],run:[1,1,1,""]},"joy.library":{"void":[3,1,1,""],BinaryBuiltinWrapper:[3,1,1,""],DefinitionWrapper:[3,2,1,""],FunctionWrapper:[3,1,1,""],SimpleFunctionWrapper:[3,1,1,""],UnaryBuiltinWrapper:[3,1,1,""],add_aliases:[3,1,1,""],app1:[3,1,1,""],app2:[3,1,1,""],app3:[3,1,1,""],b:[3,1,1,""],branch:[3,1,1,""],choice:[3,1,1,""],clear:[3,1,1,""],cmp_:[3,1,1,""],concat_:[3,1,1,""],cond:[3,1,1,""],dip:[3,1,1,""],dipd:[3,1,1,""],dipdd:[3,1,1,""],divmod_:[3,1,1,""],drop:[3,1,1,""],dupdip:[3,1,1,""],floor:[3,1,1,""],genrec:[3,1,1,""],getitem:[3,1,1,""],help_:[3,1,1,""],i:[3,1,1,""],id_:[3,1,1,""],ifte:[3,1,1,""],infra:[3,1,1,""],initialize:[3,1,1,""],inscribe:[3,1,1,""],loop:[3,1,1,""],map_:[3,1,1,""],max_:[3,1,1,""],min_:[3,1,1,""],parse:[3,1,1,""],pm:[3,1,1,""],pred:[3,1,1,""],remove:[3,1,1,""],reverse:[3,1,1,""],select:[3,1,1,""],sharing:[3,1,1,""],shunt:[3,1,1,""],sort_:[3,1,1,""],sqrt:[3,1,1,""],step:[3,1,1,""],succ:[3,1,1,""],sum_:[3,1,1,""],swaack:[3,1,1,""],take:[3,1,1,""],times:[3,1,1,""],unique:[3,1,1,""],unstack:[3,1,1,""],warranty:[3,1,1,""],words:[3,1,1,""],x:[3,1,1,""],zip_:[3,1,1,""]},"joy.library.DefinitionWrapper":{add_def:[3,3,1,""],add_definitions:[3,3,1,""],parse_definition:[3,3,1,""]},"joy.parser":{ParseError:[18,4,1,""],Symbol:[18,2,1,""],text_to_expression:[18,1,1,""]},"joy.utils":{generated_library:[3,0,0,"-"],pretty_print:[19,0,0,"-"],stack:[20,0,0,"-"]},"joy.utils.generated_library":{ccons:[3,1,1,""],cons:[3,1,1,""],dup:[3,1,1,""],dupd:[3,1,1,""],dupdd:[3,1,1,""],first:[3,1,1,""],first_two:[3,1,1,""],fourth:[3,1,1,""],over:[3,1,1,""],pop:[3,1,1,""],popd:[3,1,1,""],popdd:[3,1,1,""],popop:[3,1,1,""],popopd:[3,1,1,""],popopdd:[3,1,1,""],rest:[3,1,1,""],rolldown:[3,1,1,""],rollup:[3,1,1,""],rrest:[3,1,1,""],second:[3,1,1,""],stack:[3,1,1,""],stuncons:[3,1,1,""],stununcons:[3,1,1,""],swap:[3,1,1,""],swons:[3,1,1,""],third:[3,1,1,""],tuck:[3,1,1,""],uncons:[3,1,1,""],unswons:[3,1,1,""]},"joy.utils.pretty_print":{TracePrinter:[19,2,1,""]},"joy.utils.pretty_print.TracePrinter":{go:[19,5,1,""],viewer:[19,5,1,""]},"joy.utils.stack":{concat:[20,1,1,""],expression_to_string:[20,1,1,""],iter_stack:[20,1,1,""],list_to_stack:[20,1,1,""],pick:[20,1,1,""],stack_to_string:[20,1,1,""]},joy:{joy:[1,0,0,"-"],library:[3,0,0,"-"],parser:[18,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","classmethod","Python class method"],"4":["py","exception","Python exception"],"5":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:classmethod","4":"py:exception","5":"py:method"},terms:{"0b11100111011011":5,"23rd":15,"4b4cb6ff86e5":[],"5bkei":10,"5eb7ac5ad2c2":15,"7fde90b4e88f":15,"\u03b5":8,"abstract":[7,10,17],"boolean":[2,3,7,10],"break":[7,15],"byte":5,"case":[2,3,12,14,15,20],"class":[3,7,15,18,19,20],"default":[3,6,10,20],"export":[3,18],"final":[2,10,12],"float":[3,7,15,16,18],"function":[0,1,4,5,6,9,11,16,17,18,19,20],"g\u00e9rard":16,"import":[2,5,6,8,10,11,12,13,14,15,16],"int":[6,7,12,15,16,18,20],"long":[10,17],"new":[2,3,6,7,9,12,13,15],"p\u00f6ial":17,"p\u00f6ial06typingtool":15,"public":9,"return":[1,3,5,7,10,12,13,14,15,18,19,20],"static":[2,9],"super":15,"switch":[2,15],"throw":10,"true":[2,3,5,12,15],"try":[6,8,11,12,14,15],"void":[0,3],"while":[3,7,10,15,18,20],Adding:[7,13,17],And:[5,6,8,10,12,15,16,20],But:[0,4,5,6,7,10,13,15],CPS:7,FNs:15,For:[2,3,10,12,13,15,17,20],Has:3,Its:3,One:[2,7,15,17],TOS:[2,3],That:[5,10],The:[0,1,2,3,4,6,8,9,11,15,16,17,18,20],Then:[2,3,10,11,12,15],There:[11,12,14,15,20],These:[15,17,20],Use:[3,8,12],Using:[0,8,10,17],With:[8,12,15,17],_1000:15,__add__:15,__class__:15,__eq__:15,__ge__:15,__hash__:15,__init__:15,__main__:15,__name__:15,__radd__:15,__repr__:15,__str__:19,_names_for:15,_to_str:15,_tree_add_:10,_tree_add_e:10,_tree_add_p:10,_tree_add_r:10,_tree_add_t:10,_tree_delete_:10,_tree_delete_clear_stuff:10,_tree_delete_del:10,_tree_delete_r0:10,_tree_delete_r1:10,_tree_delete_rightmost:10,_tree_delete_w:10,_tree_get_:10,_tree_get_p:10,_tree_get_r:10,_tree_get_t:10,_tree_iter_order_curr:10,_tree_iter_order_left:10,_tree_iter_order_r:10,_tree_iter_order_right:10,_tree_t:10,_treestep_0:14,_treestep_1:14,_uniqu:15,_within_b:8,_within_p:8,_within_r:8,a10001:15,a10002:15,a10003:15,a10004:15,a1001:[],abbrevi:14,abil:15,abl:15,about:[0,7,10,15,16,20],abov:[0,5,8,10,12,15],abs:8,absolut:7,accept:[1,2,3,5,6,7,10,11,13,14,15,16],accordingli:10,accumul:5,action:[7,13,15,16],actual:[2,5,7,10,15],adapt:17,add:[3,5,6,7,13,15,19],add_alias:3,add_def:3,add_definit:[3,10,14],added:[4,10],adding:[9,15],addit:[0,2,3,5,7,12,13,14],address:17,adjust:10,after:[5,6,7,12],afterward:7,again:[2,3,5,7,10,12,15],aggreg:16,ahead:15,aka:[7,16],albrecht:0,algorithm:[7,15],alia:3,alias:[3,7],align:[7,19],all:[3,5,6,7,10,12,13,14,15,19],alloc:15,allow:[9,10],almost:10,along:[7,12,15],alphabet:3,alreadi:[8,13,15,16],also:[0,5,7,10,15,20],alter:15,altern:[4,15],although:[4,10,15],altogeth:6,alwai:[5,9,12],amaz:15,among:15,amort:10,analysi:[4,17],anamorph:[7,17],ani:[4,5,7,9,10,15,16,18],annual:7,anonym:10,anoth:[10,15,20],anyhow:15,anyjoytyp:15,anymor:15,anystarjoytyp:15,anyth:[2,3,7,15],api:9,app1:3,app2:[3,7,11,12,13],app3:3,app:7,appear:[2,4,5,10],append:15,appendix:17,appli:[2,3,5,6,10,12,15],applic:6,approach:5,approxim:17,archiv:0,aren:16,arg:[2,3],argument:[2,3,7,8,11,12,17,19,20],arithmet:2,ariti:2,around:[5,15,20],arrang:14,arriv:[6,14],articl:[0,4,6,12],ask:[4,6,15],aspect:0,assert:15,assign:20,associ:10,assum:8,astar:15,asterisk:14,asterix:15,attack:7,attempt:[0,1],attribut:3,attributeerror:15,author:15,auto:0,automat:[4,15],auxiliari:14,avail:[0,15],averag:[7,13],avoid:10,awai:10,awar:2,awkward:[10,12],azur:17,back:[10,15],backward:[9,10,11,14],bag:7,banana:12,barb:12,base:[0,2,3,9,12,14,15],basic:[1,2,3,7,10],becaus:[2,3,7,10,14,15,16,20],becom:[10,14,20],becuas:15,been:[8,9,10,15,16],befor:[6,7,10],begin:[10,14],behavior:[9,14],behaviour:[0,1,15],being:0,below:[2,3,5,6,10,15,16],bespok:7,best:0,better:[5,10,12],between:[0,5],beyond:6,biannual:7,binari:[0,6,7,17],binary_search_tre:10,binarybuiltinwrapp:3,bind:7,bingo:16,bit:[5,6,10,15],block:5,bodi:[2,7,10],body_text:3,booktitl:15,bool:12,borrow:[7,15],both:[2,5,7,11,12,13,15,20],bottom:6,bracket:[7,15,18],branch:[3,5,6,12,15],branch_fals:15,branch_tru:15,breakpoint:7,bring:[5,7,15],bruijn:15,brzozowski:15,btree:[10,14],buck:10,bug:[0,7],build:[6,7,11,12,15,16,20],built:[11,15],bundl:[2,3,12],burgeon:7,calculu:4,call:[2,7,9,10,12,15,19,20],caller:10,can:[0,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,20],cannot:15,captur:7,card:7,care:[5,20],carefulli:16,carri:[6,10],cartesian:4,catamorph:17,categor:[0,17],categori:4,ccc:4,ccon:[3,10,15],cell:[12,15],certain:[7,20],certainli:10,chain:[3,15],chang:[2,9,10,15,16],charact:16,chat:7,chatter:[0,15],check:[6,8,15],child:14,choic:[3,12],choos:9,chop:11,cinf:10,circuit:4,cite_not:10,classmethod:3,claus:[3,15],clean:15,clear:[3,5,7],clear_stuff:10,cleav:[7,11,13],close:[0,1,4],clunki:[5,15],cmp:[3,14,17],cmp_:3,code:[0,1,4,11,12,15,17],codireco:[6,8],collaps:12,collect:[4,6,7,15],combin:[0,3,5,6,7,8,11,14,16,17],combinatorjoytyp:15,combo:15,come:[7,10,15],command:[7,10,15],common:[2,5],compar:[3,4,15],comparison:[0,10],compel:4,compil:[2,4,7,10,13,17],complet:[4,15],complex:[3,15,16],complic:15,composit:15,compostit:15,compound:10,comput:[2,4,5,7,11,15],con:[3,5,6,7,8,10,11,12,14,16,20],conal:4,concat:[3,6,7,14,20],concat_:3,concaten:0,concatin:[0,3,20],conclus:17,concurr:2,cond:[3,10],condit:[3,7],confer:15,conflict:[10,15],conjectur:15,consecut:17,consid:[5,6,10,12,14,15,16],consist:[2,6,7,14],constant:10,constitu:12,constraint:15,construct:15,consum:15,contain:[0,2,3,6,7,12,15],content:15,context:2,conting:10,continu:[0,12,15,16],control:7,conveni:[4,15],convers:15,convert:[12,13,14,15,18,20],cool:10,copi:[2,3,5,10,12,14,17],copyright:7,correct:15,correspond:4,could:[2,4,5,7,9,10,15,16],count:[3,15],counter:[5,15],coupl:14,cours:[5,10,15],cover:15,crack:10,crap:15,crash:10,creat:[0,2,3,5,8,10,15],creativ:15,crude:[10,15,18],currect:[],current:[2,3,7,12,14,15,16,19],custom:9,cycl:[5,6],cython:7,dai:7,data:[2,3,12],datastructur:[0,2,12,15,17,18,20],datatyp:20,ddee30dbb1a6:15,ddididi:16,deal:[0,10],dealt:15,decid:10,declar:15,decor:3,decoupl:12,decrement:3,deduc:[5,15],deeper:0,deepli:4,def:[3,7,12,13,15,20],defaultdict:15,defi:3,defin:[2,3,4,5,6,7,8,9,11,12,13,15,16,17],definit:[2,3,5,6,7,9,10,12,14,15,17],definitionwrapp:[3,10,12,14],deleg:7,delet:17,deliber:15,demonstr:4,depend:[3,10,12],deposit:14,depth:15,dequot:12,der:10,deriv:[2,3,5,7,8,10,15,17],describ:[3,4,10,12,14,15,18],descript:[5,7],descriptor:15,design:[2,3,10,17],desir:[7,14],destruct:10,detail:[7,10,15],detect:[6,10,12,15],determin:17,develop:[0,6,7,15,17],diagram:5,dialect:1,dict:[1,3,15],dictionari:[0,1,3,7,15,17],differ:[0,4,5,8,10,11,12,20],differenti:4,difficult:15,dig:[10,16],digit:5,dinfrirst:7,dip:[3,5,6,7,8,10,11,12,13,14,15,17],dip_a:15,dip_t:15,dipd:[3,6,7,10,11,12,15,16],dipdd:[3,10,15],direco:17,direct:7,directli:[5,14,15,20],disappear:[2,15],discard:[3,6,8,10,12],disciplin:10,disenstacken:7,disk:7,displac:2,displai:15,distiguish:15,ditch:10,div:[3,7],dive:14,divis:10,divmod:3,divmod_:[3,15],doc:[2,3,7,15],document:[17,18,20],doe:[0,1,4,6,7,13,17,19],doesn:[5,9,10,14,15,20],doing:[4,5,7,15,16],domain:[4,15],don:[5,7,10,15],done:[2,5,7,9,15],door:7,dot:19,doubl:[5,7,15],down:[2,8,12,15,16],down_to_zero:7,dozen:7,draft:[4,9],dream:7,drive:[6,8],driven:5,driver:6,drop:[3,10],dudipd:7,due:15,dup:[3,5,6,7,8,10,11,12,16,20],dupd:[3,15],dupdd:3,dupdip:[3,5,10,11,12,15],duplic:[3,10,12],durat:2,dure:[2,12],each:[2,3,4,5,7,12,13,14,15,19],easi:[0,10,14,15,16],easier:[3,10],easili:4,edit:17,effect:[2,3,7,16,17],effici:[6,13,16],either:[1,2,3,10,12,15],elabor:15,eleg:[7,10,15],element:2,elif:15,elimin:15,elliott:4,els:[2,3,12,15],else_:15,embed:[4,10,16],emit:15,empti:[3,7,14,15,20],encapsul:7,enclos:7,encod:6,encount:15,end:[5,10,12,14,15,20],endless:6,enforc:[2,7],engend:7,enorm:15,enough:[7,12,15,19],enstacken:[6,7,15],enter:7,entir:20,entri:[3,16,19],enumer:15,epsilon:8,equal:[5,14,20],equat:[7,8],ergo:10,err:10,error:[7,18],essai:0,establish:15,etc:[3,14,15,16,18],euler:17,euro:15,eval:[0,15],evalu:[1,2,3,7,8,10,11,12,13,14,15],event:15,eventu:15,everi:[6,15],everyth:[3,10,11,15],evolv:9,examin:12,exampl:[0,3,5,15,17,18,20],exce:6,except:[7,10,15,18],execut:[0,1,2,3,7,12,13,14,15,16,20],exend:15,exercis:10,exist:[4,10,15],expand:10,expect:[2,3,14,15,20],experi:[7,14],explain:15,explan:7,explor:7,express:[0,1,2,3,4,10,12,13,15,16,19,20],expression_to_str:20,extend:15,extra:[5,6],extract:[10,11,17],extrem:7,extrememli:7,f1001:[],f_g:15,f_in:15,f_out:15,f_python:15,facet:0,facil:7,fact:18,factor:[2,5,7,10,15],factori:17,fail:[2,3,10,18],fairli:15,fale:[],fals:[2,3,5,12,15],far:[8,10,12,15],fascin:0,fear:[10,15],few:[5,7,8,11],fewer:[3,7],fg_in:15,fg_out:15,fib:6,fib_gen:6,fibonacci:17,figur:[2,3,10,12],filter:10,fin:5,find:[2,3,5,6,14,15,17],finder:8,fine:[0,5,10,15],first:[3,6,7,8,10,11,12,13,14,16,17],first_two:[3,10],fit:[5,7],five:[5,7,17],fix:[2,3,12,15],fixm:[],flag:15,flatten:[7,14,15],flexibl:17,floatjoytyp:15,floatstarjoytyp:15,floor:3,floordiv:5,flow:7,follow:[0,2,3,7,9,12,14,15,16],foo:[7,9,10,15],foo_ii:9,form:[2,3,4,5,6,12,14,15,20],forman:7,format:[15,17,19],formula:[0,5,17],forth:[7,15],forum:0,forward:15,found:7,foundat:15,four:[2,3,5,6,7,10,17],fourteen:5,fourth:[2,3,10,12],fractal:7,fraction0:7,fraction:[2,7],frame:12,framework:7,free:[4,7,10],freeli:2,from:[0,1,2,3,5,6,7,8,10,11,12,13,14,15,16,17,20],from_iter:15,front:[2,3,12],full:5,fulli:15,fun:17,func:15,functionjoytyp:15,functionwrapp:3,funtion:10,further:[8,15,17],g_in:15,g_out:15,garbag:7,gari:10,gcd:7,gener:[0,2,4,12,15,17,20],generated_librari:3,genrec:[3,7,10,12,14],geometr:5,get:[2,4,5,6,7,11,12,15,17],getitem:3,getrecursionlimit:20,getsourc:7,ghc:4,give:[4,5,10,12,14,15,20],given:[2,3,5,6,8,10,12,15,16,17],global:15,glue:7,going:[10,11,14,15,16],good:[5,10],grab:[3,15],grammar:18,grand:7,great:[0,7,15,17],greater:20,grok:15,group:0,gsra:8,guard:10,had:[5,15,16],haiku:7,half:[5,15,16],hand:[7,13,15,17],handi:[8,15],handl:[10,15,20],happen:[7,15],hard:[15,16],hardwar:4,has:[0,2,6,7,8,9,10,12,15,16,20],hash:15,haskel:4,have:[2,3,5,6,7,8,9,12,13,15,16,17,20],haven:15,head:20,help:[7,10,12,15],help_:3,helper:3,herd:7,here:[5,6,10,14,15,16],hide:10,hierarchi:15,higher:[7,10],highli:7,histori:[15,19],hmm:10,hoist:3,hold:[5,15],hood:10,hope:[0,5,7,15,17],hopefulli:12,host:17,how:[0,4,8,10,12,15,16,17],howev:[12,13,15],html:[2,3,6,11,12,17],http:10,huet:16,huge:10,hugh:[8,14],human:7,hybrid:15,hylomorph:17,hypothet:2,id_:3,idea:[4,5,7,15],ident:[3,12,15],if_not_empti:10,ift:[3,10,12,14,15],ignor:[3,10,15],iii:17,illustr:12,imagin:16,imap:15,imit:14,immedi:12,immut:[7,10],imper:12,implement:[0,1,2,3,4,7,9,10,12,13,17],impli:15,implicit:7,includ:[4,10,14,15],inclus:5,incom:20,incompat:9,incorpor:11,increas:5,increment:[3,4,5,9],index:[0,7,15,20],indexerror:20,indic:[14,15],ineffici:15,infer:[0,17],inform:[3,15],infra:[3,6,7,10,11,13,14,15,17],infrastructur:3,initi:[2,3,7,8,10],inlin:10,inner:15,inproceed:15,input:[1,8,15],inscrib:3,insert:15,insight:12,inspect:7,instal:0,instanti:[4,19],instead:[5,6,10,12,15,16,20],integ:[2,3,7,12,14,15],integr:3,intend:[0,7],interact:[7,17],interest:[0,5,10,15,17],interlud:17,intermedi:12,intern:[0,15,19,20],interpret:[0,4,9,13,17,18,19],interrupt:7,interv:[4,5],intjoytyp:15,introduc:9,introduct:0,intstarjoytyp:15,intuit:15,invari:3,invent:15,involv:15,ipf:7,ipython:15,isinst:15,isn:[10,16],issubclass:15,item:[2,3,7,10,12,14,15,17,20],iter:[1,3,7,12,14,15,17,20],iter_stack:[13,15,20],iteritem:15,itertool:15,its:[0,2,3,4,5,7,10,12,14,15,20],itself:[0,2,7,10,15],j05cmp:[2,3,12],jaanu:15,job:17,john:[8,14],joi:[2,4,9,10,11,13],join:15,joypi:[7,16],june:15,junk:17,jupyt:17,just:[0,2,3,6,7,9,10,12,14,15,16],kav:15,keep:[10,11,15,16],kei:[14,17],kevin:0,key_n:10,keyerror:[10,15],kind:[2,4,7,10,12,14,15],kinda:15,kjs:15,kleen:[14,15],kleenestar:15,kleffner:15,know:[5,10,15],knowledg:15,known:4,l2s:15,l_kei:10,l_left:10,l_right:10,l_valu:10,label:15,lambda:[4,15],languag:[4,7,9,10,13,15],larg:15,larger:20,largest:3,last:[5,10,12,15],lastli:6,later:[7,14,15],law:[2,15],lazi:15,lazili:8,lcm:5,lead:[7,15],leaf:10,lean:7,learn:0,least:[2,5,12,15,20],least_fract:7,leav:5,left:[7,11,12,14,15,16,19,20],leftov:12,len:15,length:[3,5,20],lens:12,less:[5,6,7,12,15,20],let:[6,8,10,11,12,14,15,16],letter:15,level:[4,10],librari:[0,13],like:[2,3,5,7,14,15,17,18],limit:15,line:[3,7,10,11,19],linear:20,link:0,linux:0,list:[0,3,5,7,8,10,12,14,16,19],list_to_stack:[15,20],lit:15,liter:[1,10,14,15,16,18],literatur:15,littl:[6,10,15,17],live:17,lkei:14,load:[5,7],local:15,locat:2,locu:19,lof:15,log_2:10,logic:[0,5,17],longer:[10,15],look:[6,7,8,10,11,15],lookup:7,loop:[0,1,3,5],lose:15,lot:[7,10,16],love:5,low:4,lower:5,lowercas:15,lowest:10,machin:0,machineri:[10,15],macro:7,made:[0,7,15,16],magic:15,mai:[2,12,15],mail:0,main:[0,3,7,11,15,16],mainloop:9,maintain:16,major:9,make:[2,3,4,5,7,10,12,13,14,15,16,17],make_gener:8,manfr:[0,2,3,4,12],mani:[0,7,15],manipul:15,manner:11,map:[1,3,5,7,9,12,14,15],map_:3,marker:7,mask:[5,6],match:[0,1],materi:[0,15],math:[0,7,8,10,11,15],mathemat:7,matter:[5,8,10,14],max_:3,maximum:3,mayb:10,mean:[4,5,7,8,10,12,14,15,20],meant:[7,10,12,14],member:[2,3,12],mental:[7,15],mention:2,mercuri:0,mess:15,meta:[7,10,13],meta_compos:15,metal:15,method:[0,3,7,15,17,19],midpoint:5,might:[4,6,10,15],mike:10,million:6,min_:3,mind:15,minimum:3,minor:10,minu:3,mirror:0,miscellan:0,mix:[7,15],mod:3,mode:15,model:[4,7,15],modern:0,modif:6,modifi:[7,10,16],modul:[0,1,3,7,15,18],modulu:7,moment:15,month:7,more:[0,3,4,5,6,7,8,12,13,14,15,18,20],most:15,mostli:0,motiv:15,move:10,movement:2,much:[5,6,10,12,15],muck:10,mul:[7,11,16,19],multi:3,multipl:17,must:[2,3,5,9,12,14,15],myself:15,n10001:15,n10002:15,n10003:15,n1001:15,n1002:15,n1003:15,name:[1,3,7,9,10,12,15,16,17,18,20],natur:[5,6,10],navig:16,nearli:15,neat:10,neato:15,necessarili:15,need:[2,3,5,6,8,9,10,12,15],neg:[3,11],nest:[3,7,10,16],network:7,never:[9,12],new_def:15,new_f:15,new_fo:15,new_kei:10,new_valu:10,newton:[0,17],next:[5,14,15],nice:[0,12,20],niether:2,node:[14,17],node_kei:10,node_valu:10,non:[14,15],none:[1,3,15],nope:14,notat:[7,10],note:[2,5,8,10,12,15,20],notebook:[5,6,7,15,16,17],notebook_preambl:[2,5,6,8,10,11,12,13,14,15,16],noth:[2,10],notic:5,now:[5,6,7,12,13,14,15,17],nth:[3,20],nullari:[7,10],number:[1,2,3,5,6,8,20],numberjoytyp:15,numberstarjoytyp:15,numer:15,object:[15,18],observ:5,obviou:6,obvious:15,occur:10,odd:[5,6],off:[2,3,5,6,11,16],okai:[],old:[2,13],old_k:10,old_kei:10,old_valu:10,omit:[12,15],onc:[3,9,10],one:[2,3,5,6,10,12,14,15,19,20],ones:[6,15],onli:[2,3,5,10,12,15,16,20],onto:[1,2,3,7,12,20],open:[7,15],oper:[3,7,10,12,15,20],oppos:15,optim:10,option:[1,7,10,20],order:[0,2,3,7,12,15,17,20],org:[0,10],origin:[0,1,2,3,10,15,16],other:[0,2,3,4,7,10,12,14,15,20],otherwis:[3,5,6,10,14,15],our:[5,6,7,8,12,14,15],out:[2,3,4,5,6,7,8,10,11,12,15,16],outcom:14,output:[8,12,15],outsid:4,over:[3,4,5,6,7,8,10,11,14,15,17],overhaul:15,overview:15,own:[10,15],pace:15,pack:20,packag:[0,7],page:[0,10,15,20],pair:[2,3,5,6,10,15],palidrom:5,palindrom:5,pam:7,paper:[4,7,12,16],paradigm:17,parallel:2,paramet:[1,2,3,12,13,18,19,20],parameter:17,paramorph:12,parenthes:[10,20],pariti:6,pars:[0,3,7],parse_definit:3,parseerror:18,parser:[0,15],part:[2,3,8,12,14,17],partial:15,particular:16,pass:[0,10,15,19],path:17,pattern:[5,14,17],pe1:[5,6],pe2:6,pearl:16,pend:[3,7,12,16,19],peopl:17,per:[7,14],perform:15,perhap:6,period:7,permit:[15,20],permut:15,persist:10,phase:2,pick:[5,6,20],pickl:7,pictur:10,piec:12,pip:0,place:[3,5,7,15],plai:0,plu:3,plug:[6,12,14],point:[4,7,10,12],pointless:2,pop:[3,5,6,7,10,12,13,14,20],popd:[3,7,8,10,13,15],popdd:[3,6,11,15],popop:[3,5,6,7,8,10,14,15],popopd:3,popopdd:3,posit:[3,5,7,12],possibilit:10,possibl:[10,14,15,17],post:7,poswrd:15,power:7,pragmat:5,preambl:8,precis:[0,1],pred:[3,15],predic:[2,3,6,12],prefix:[15,19],present:15,preserv:[4,14],pretti:[8,10,11,14,15,19,20],pretty_print:0,previou:7,primari:15,prime:8,primit:[2,3,15,17],primrec:[3,6,7,8,12],principl:15,print:[0,1,2,3,15,19,20],probabl:[6,7,10,15],problem:[7,15,17],proc_curr:10,proc_left:10,proc_right:10,proce:5,process:[7,14,15,19],produc:[5,10,12,14,15],product:[6,7,15],program:[0,2,3,6,7,8,10,12,15,16],programm:15,progress:15,project:17,prompt:7,proper:[2,3,12],properti:0,provabl:15,proven:15,provid:[0,3,4,7,15],pun:[0,7],punctuat:15,pure:0,puriti:7,purpos:7,push:[2,3,7,12,16,20],pushback:7,put:[1,2,6,7,15,17,20],pypi:0,python:[0,2,3,10,12,16,17,18,20],quadrat:[0,17],queri:[10,14],query_kei:14,queu:12,quit:[0,1,14],quot:[0,3,6,7,10,11,12,14,15,16,19],quotat:[2,3,12],quotient:3,r_kei:10,r_left:10,r_right:10,r_valu:10,rais:[10,15,18,20],rang:[7,15],range_revers:12,range_to_zero:7,ranger:12,ranger_revers:12,raphson:8,rather:[5,7,12,14],ratio:7,reach:[5,6,12],read:[0,1,5,6,10,15,16],readabl:13,reader:10,readi:15,real:10,realiz:[4,10],rearrang:[2,10,15],reason:[5,7,15],rebuild:[14,16],rec1:[2,3,12],rec2:[2,3,12],recent:15,recogn:18,record:[7,19],recur:[12,15],recurs:[0,2,3,6,7,8,15,17,20],recus:7,recycl:15,redefin:17,redistribut:[3,7],reduc:[2,15],redund:20,refactor:[7,9],refer:[0,2],regist:2,regular:[15,18],reimplement:17,relat:15,releas:9,remain:[2,7,9],remaind:[3,8],remind:15,remov:[3,10,15,20],render:17,repeat:5,repeatedli:5,repl:[0,1],replac:[0,2,3,6,11,12,14,15,16,17,20],repositori:0,repr:15,repres:[2,7,10,18,19],represent:20,reprod:6,repurpos:15,requir:[15,20],res:15,research:15,resembl:7,respect:5,rest:[3,5,6,7,10,12,16,17,20],rest_two:10,restat:15,restor:2,restrict:15,result:[1,2,3,5,10,11,12,14,15,16],resum:7,retain:15,retir:2,retri:7,reus:[10,15],revers:[3,5,6,12,15,16,20],revisit:15,rewrit:[3,7,15],rewritten:7,rich:15,rid:10,right:[6,7,11,14,15,17,19,20],rightest:10,rightmost:5,rkei:14,rob:15,robot:15,roll:[3,8,10,14],roll_dn:15,roll_down:[],roll_up:[],rolldown:[3,15],rollup:[3,15],root:[3,8,11],round:15,rrest:[3,15],rule:17,run:[0,1,3,5,7,8,10,11,12,14,16],runtimeerror:20,s1000:[],s1002:[],s23:[],sai:[6,10,11,14,15],same:[2,4,5,10,15,20],sandwich:[2,3,12],save:[2,5,7],scan:3,scanner:[7,18],scenario:16,scope:[6,10],search:[0,10],sec:15,second:[3,7,10,12,14,20],section:12,see:[0,6,7,8,9,11,12,13,15,16,19],seem:[0,5,7,14,15],seen:[15,16],select:3,self:15,semant:[2,3,7,9,10,15],semi:7,send:7,sens:[0,2,5,15,16],separ:[7,15],seq:15,sequenc:[0,1,2,3,5,7,10,12,13,16,17,18],sequence_to_stack:15,seri:[5,6,10,16],ses:15,set:[2,3,12,15,17],seven:[5,6],sever:[0,4,7,12],share:[3,7],shelf:2,shift:[5,6],shorter:17,shorthand:10,should:[2,3,5,10,12,15],shouldn:7,show:[4,16],shunt:[3,16],side:[10,15],signifi:[7,10],similar:[10,14,15],simon:7,simpl:[7,12,15,20],simplefunctionwrapp:[3,13,15],simpler:14,simplest:[15,17],simpli:4,simplifi:[5,10,16],sinc:[2,5,10,15],singl:[3,6,7,13,15,18],situ:10,situat:10,six:[5,6,7],sixti:[5,6],size:[7,17],skeptic:7,skip:15,slight:8,slightli:[10,12,15],smallest:3,smart:[10,15],softwar:[7,15],solei:2,solut:[5,6],solvabl:7,some:[2,3,6,7,10,12,14,15,17,20],somehow:[10,15],someth:[2,9,10,15],sometim:10,somewher:[10,17],sort:[3,10,15],sort_:3,sorta:15,sourc:[0,1,3,15,17,18,19,20],space:[5,19],span:5,spawn:15,special:[6,10,15,17],specif:[0,4],specifi:[10,15],speed:13,spell:14,sphinx:[17,20],spirit:[0,1,14],split:15,sqr:[7,8,11,16],sqrt:[3,8,15],squar:[3,8,15,18],stack:[0,1,3,5,6,8,10,11,12,13,14,16,17,18,19],stack_concat:15,stack_effect:15,stack_effect_com:15,stack_to_str:20,stacki:15,stackjoytyp:15,stackstarjoytyp:15,stage:14,stai:[0,1],stand:4,standard:[7,10],star:[14,15],stare:10,start:[5,6,7,8,10,12,14,15],state:7,statement:3,step:[3,5,7,10,13,15,16,17],still:[10,15],stop:10,storag:[5,10],store:[5,12],stori:12,str:[1,15,18,19,20],straightforward:[1,6,8,15,17],stream:5,stretch:10,string:[1,2,3,7,15,16,18,19,20],strip:15,structur:[7,14,15,16,17,20],stuff:[10,15],stuncon:3,stununcon:3,style:[0,4,15],sub:9,subclass:7,subject:16,subset:15,substitut:[10,15],subtract:5,subtyp:17,succ:[3,15],succe:15,success:8,suffic:15,suffici:10,suffix:15,suggest:[4,10],suitabl:[3,4,5],sum:[3,6,7,11,12,13,14,15],sum_:[3,15],summand:5,sumtre:14,suppli:[10,18],support:[7,15,19,20],suspect:2,swaack:[3,11,13,15,16],swap:[3,5,6,7,8,10,12,13,14,16],swarm:15,swon:[3,6,7,12,14,15,16],swoncat:[6,7,8,12,14],swuncon:12,symbol:[2,3,15,16,17,18],symboljoytyp:15,symmetr:[5,10],syntact:7,syntax:[7,20],sys:20,system:[7,10,15],tabl:15,tag:15,tail:[10,15,17,20],take:[3,5,7,8,10,12,15,20],talk:[7,10,15,20],target:16,tast:4,tbd:7,tear:12,technic:2,techniqu:[4,16],technolog:2,temporari:16,ten:5,term:[1,2,7,8,12,15,17,18,20],termin:[2,3,12],ternari:7,test:[2,3,12],text:[0,1,3,15],text_to_express:[7,15,18],textual:7,than:[0,3,5,6,7,8,12,14,15,20],thei:[2,5,6,7,10,12,15,16,18,20],them:[2,3,5,6,10,12,15,16,17],themselv:15,theori:[2,3,12],therefor:[6,15],thi:[0,1,2,3,4,5,6,7,8,11,12,14,15,16,17,18,19,20],thing:[2,6,10,12,15,16,18,20],think:[2,5,7,10,12,14,15],third:[3,6,7,10],thirti:5,those:[2,3,10,12,15,17],though:5,thought:7,thousand:5,thread:2,three:[2,3,5,7,10,11,14,15,17],through:[1,5,7,14,15,16,20],thun:[2,3,4,9,12],thunder:7,time:[3,5,7,8,10,12,15,16],titl:15,to_set:10,todai:7,todo:[7,18],togeth:[6,7,15,17],token:18,toler:17,too:[12,15],tool:[7,15],tooo:15,top:[2,3,7,12,15,19,20],total:5,tower:15,trace:[0,7,11,12,16,17,20],traceback:15,traceprint:19,track:[11,15,16],tracker:0,transform:4,translat:[4,11,15],trash:15,travers:[0,17],treasur:0,treat:[0,2,3,12,15,17],treatment:6,tree:[0,7,17],treegrind:17,treestep:[0,17],tri:5,triangular_numb:12,trick:[5,15],tricki:15,trobe:0,trove:0,truli:15,trust:15,truthi:[3,7],tuck:[3,7,15],tupl:[3,7,15,20],ture:15,turn:[2,3,15],twice:[10,12],two:[2,3,5,7,8,10,11,12,14,15,16,17,20],type:[0,1,4,7,10,12,17,18,19,20],typeerror:15,typeless:15,typic:[2,3,11,12],unari:7,unarybuiltinwrapp:3,unbalanc:[10,18],unchang:10,uncompil:15,uncon:[3,6,7,10,12,14,16],under:[2,3,7,10],underli:15,underscor:15,understand:[0,10,15],undistinguish:10,undocu:7,unend:15,unfinish:15,unfortun:20,unif:15,uniqu:[3,10,15],unit:[7,12],univers:[0,7,15],unnecessari:17,unnecesssari:15,unpack:[2,3,10,20],unpair:5,unquot:[7,14],unstack:[3,15],unswon:3,untangl:12,until:6,unus:5,unusu:10,updat:[0,17],usag:7,use:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,20],used:[3,4,7,10,12,16,18,20],useful:[0,15],user:14,uses:[2,5,12],using:[3,6,10,11,12,14,16],usual:[0,2,12],util:[0,3,13,15],valid:15,valu:[0,2,3,5,7,8,11,12,13,14,15,17,20],value_n:10,valueerror:[15,20],variabl:[15,17],variant:10,variat:[12,17],varieti:[4,7],variou:0,vener:20,verbos:4,veri:[0,1,4,7,10,20],verifi:15,versa:[2,15],version:[0,1,2,6,9,14,16,17],via:7,vice:[2,15],view:[10,17],viewer:[1,7,9,19],vii:17,von:[0,2,3,4,12],wai:[0,2,3,4,5,7,12,13,15],wait:[],want:[2,5,6,8,10,12,15],warranti:[3,7],wash:7,wast:7,web:20,websit:[0,5],welcom:7,well:[0,4,7,8,10,15,18],were:[7,15,16],what:[2,3,4,7,10,12,14,15,19],whatev:[2,3,12,14,20],when:[5,6,7,10,12,15,16,18,20],where:[2,3,7,10,12,15,17,20],whether:12,which:[0,1,3,5,7,8,10,12,14,15,16,20],whole:[2,3,5,12,14,15],whose:6,why:[8,14],wiki:10,wikipedia:[0,10,16],wildli:7,wind:7,wire:12,within:[7,10,13,17],without:[2,7,10,11,15],won:[10,15,20],word:[0,3,5,7,12,16],work:[0,3,5,6,7,8,10,11,12,14,15,16,20],worth:5,would:[2,5,6,7,8,10,12,15,16,20],wrap:[3,7],wrapper:15,write:[4,8,10,12,14,15,16,17,20],written:[0,1,8,10,13,15,20],wrong:2,wrote:15,xrang:15,yang:15,year:[7,15],yet:[10,15,16],yield:[2,3,12,15,20],yin:17,you:[0,2,3,5,6,7,9,10,11,12,13,14,15,16,19,20],your:[2,3,7,12,15],yourself:[7,10],zero:[3,10,12,14,15,18,20],zip:[5,15],zip_:3,zipper:[0,17],zstr:16},titles:["Thun 0.2.0 Documentation","Joy Interpreter","Functions Grouped by, er, Function with Examples","Function Reference","Categorical Programming","Developing a Program in Joy","Using x to Generate Values","Thun: Joy in Python","Newton\u2019s method","No Updates","Treating Trees I: Ordered Binary Trees","Quadratic formula","Recursive Combinators","Replacing Functions in the Dictionary","Treating Trees II: treestep","Type Inference","Traversing Datastructures with Zippers","Essays about Programming in Joy","Parsing Text into Joy Expressions","Tracing Joy Execution","Stack or Quote or Sequence or List\u2026"],titleterms:{"abstract":15,"case":[8,10],"function":[2,3,7,8,10,12,13,14,15],"long":13,"new":10,"p\u00f6ial":15,"void":2,"while":2,Adding:10,One:[6,10],The:[5,7,10,12,14],There:7,Using:6,With:14,about:17,add:[2,10],adding:10,address:16,altern:14,ana:12,analysi:5,anamorph:[2,12],app1:2,app2:2,app3:2,appendix:[10,12,15],approxim:8,argument:15,auto:3,averag:2,base:[8,10],binari:[2,10,14],both:10,branch:[2,10],can:10,cata:12,catamorph:12,categor:4,chatter:2,child:10,choic:2,clear:2,cleav:2,cmp:10,code:[7,10],combin:[2,10,12,15],comment:15,compar:10,comparison:2,compil:[6,15],compile_:15,compos:15,comput:8,con:[2,15],concat:[2,15],conclus:12,consecut:8,continu:7,current:10,datastructur:[7,10,16],deal:15,defin:[10,14],definit:11,delabel:15,delet:10,deriv:[11,12,14],design:12,determin:16,develop:5,dialect:0,dictionari:13,dip:[2,16],dipd:2,dipdd:2,direco:6,disenstacken:2,distinguish:15,div:2,doc_from_stack_effect:15,document:0,doe:10,down_to_zero:2,drop:2,dup:[2,15],dupd:2,dupdip:2,effect:15,els:10,empti:10,enstacken:2,equal:10,essai:17,euler:[5,6],eval:7,even:6,exampl:[2,7,10,12,14],execut:19,express:[7,18],extract:14,factori:12,fibonacci:6,filter:5,find:[8,10,12],first:[2,5,15],five:6,flatten:2,flexibl:14,floordiv:2,formula:11,found:10,four:12,fun:12,further:5,gcd:2,gener:[3,5,6,8],genrec:2,get:[10,14],getitem:2,given:14,greater:10,group:2,have:[10,14],help:2,highest:10,host:0,how:[5,6],hylo:12,hylomorph:12,identifi:15,ift:2,iii:15,implement:15,indic:0,infer:15,inferenc:15,inform:0,infra:[2,16],integ:5,interest:6,interlud:10,intern:18,interpret:[1,7,15],item:16,iter:[5,10],joi:[0,1,3,5,7,12,15,16,17,18,19,20],junk:15,just:5,kei:10,languag:0,least_fract:2,left:10,less:10,let:5,librari:[3,7,15],like:10,list:[2,15,20],literari:7,littl:5,logic:[2,15],loop:[2,7],lower:10,lshift:2,make:[6,8],mani:5,map:2,math:2,method:8,min:2,miscellan:2,mod:2,modifi:15,modulu:2,more:10,most:10,mul:[2,15],multipl:[5,6,15],must:10,name:11,neg:2,newton:8,next:8,node:10,non:10,now:10,nullari:2,number:[12,15],one:7,onli:7,order:[10,14],osdn:0,our:10,over:2,pack:5,pam:2,para:12,paradigm:15,parameter:[10,14],pars:[2,18],parser:[7,18],part:15,pass:7,path:16,pattern:12,per:10,pop:[2,15],popd:2,popop:2,pow:2,power:6,pred:2,predic:[5,8,10,14],pretty_print:19,primit:12,primrec:2,print:7,problem:[5,6],process:10,product:2,program:[4,5,11,14,17],project:[0,5,6],pure:7,put:[10,11,14],python:[7,13,15],quadrat:11,quick:0,quot:[2,20],rang:[2,5,12],range_to_zero:2,read:7,recur:[8,10],recurs:[10,12,14],redefin:[10,14],refactor:[5,10],refer:3,regular:7,reimplement:14,relabel:15,rem:2,remaind:2,remov:2,render:5,repl:7,replac:[10,13],repres:15,reset:6,rest:[2,15],revers:2,right:[10,16],rightmost:10,roll:[2,15],rolldown:2,rollup:2,rshift:2,rule:15,run:[2,6],second:[2,15],select:2,sequenc:[6,15,20],set:[8,10],shorter:13,should:7,shunt:2,simplest:5,size:[2,13],someth:[],sourc:10,special:12,sqr:[2,15],sqrt:[2,11],stack:[2,7,15,20],start:0,step:[2,12,14],straightforward:11,structur:10,style:7,sub:[2,10],subtyp:15,succ:2,sum:[2,5],swaack:2,swap:[2,15],swon:2,swoncat:2,symbol:[7,12],tabl:0,tail:12,take:2,term:[5,6,14],ternari:2,text:18,than:10,them:11,thi:10,third:[2,15],three:6,thun:[0,7],time:[2,6],togeth:[10,11,14],token:7,toler:8,trace:[13,19],traceprint:7,travers:[10,14,16],treat:[10,14],tree:[10,14,16],treegrind:14,treestep:14,triangular:12,truediv:2,truthi:2,tuck:2,two:6,type:15,unari:2,unbound:15,uncon:[2,15],unifi:15,unit:2,unnecessari:5,unquot:2,unstack:2,updat:[9,15],use:15,util:[19,20],valu:[6,10],variabl:11,variat:6,version:[5,10,13,15],view:7,vii:15,within:8,word:2,write:11,xor:2,yin:15,zero:6,zip:2,zipper:16}}) \ No newline at end of file diff --git a/docs/sphinx_docs/notebooks/Types.rst b/docs/sphinx_docs/notebooks/Types.rst index 4a1a80d..216ce90 100644 --- a/docs/sphinx_docs/notebooks/Types.rst +++ b/docs/sphinx_docs/notebooks/Types.rst @@ -211,7 +211,7 @@ The simplest way to "compile" this function would be something like: .. code:: ipython2 def poswrd(s, e, d): - return roll_down(*swap(*pop(s, e, d))) + return rolldown(*swap(*pop(s, e, d))) However, internally this function would still be allocating tuples (stack cells) and doing other unnecesssary work. @@ -1045,9 +1045,9 @@ from their stack effect comments: def defs(): - roll_down = (1, 2, 3), (2, 3, 1) + rolldown = (1, 2, 3), (2, 3, 1) - roll_up = (1, 2, 3), (3, 1, 2) + rollup = (1, 2, 3), (3, 1, 2) pop = (1,), () @@ -1094,13 +1094,13 @@ from their stack effect comments: return (a1, stack) - def roll_down(stack): + def rolldown(stack): """(1 2 3 -- 2 3 1)""" (a2, (a1, (a0, stack))) = stack return (a0, (a2, (a1, stack))) - def roll_up(stack): + def rollup(stack): """(1 2 3 -- 3 1 2)""" (a2, (a1, (a0, stack))) = stack return (a1, (a0, (a2, stack))) @@ -1482,9 +1482,9 @@ Rewrite the stack effect comments: def defs(): - roll_down = (A[1], A[2], A[3]), (A[2], A[3], A[1]) + rolldown = (A[1], A[2], A[3]), (A[2], A[3], A[1]) - roll_up = (A[1], A[2], A[3]), (A[3], A[1], A[2]) + rollup = (A[1], A[2], A[3]), (A[3], A[1], A[2]) pop = (A[1],), () @@ -1559,8 +1559,8 @@ Rewrite the stack effect comments: popop = (a2 a1 --) pred = (n1 -- n2) rest = ([a1 .1.] -- [.1.]) - roll_down = (a1 a2 a3 -- a2 a3 a1) - roll_up = (a1 a2 a3 -- a3 a1 a2) + rolldown = (a1 a2 a3 -- a2 a3 a1) + rollup = (a1 a2 a3 -- a3 a1 a2) rrest = ([a0 a1 .0.] -- [.0.]) second = ([a0 a1 .0.] -- a1) sqrt = (n0 -- n1) @@ -1596,7 +1596,7 @@ Revisit the ``F`` function, works fine. .. code:: ipython2 - F = reduce(C, (pop, swap, roll_down, rest, rest, cons, cons)) + F = reduce(C, (pop, swap, rolldown, rest, rest, cons, cons)) F @@ -1629,7 +1629,7 @@ also get the effect of combinators in some limited cases. .. code:: ipython2 # e.g. [swap] dip - neato(roll_up, swap, roll_down) + neato(rollup, swap, rolldown) .. parsed-literal:: @@ -1640,7 +1640,7 @@ also get the effect of combinators in some limited cases. .. code:: ipython2 # e.g. [popop] dipd - neato(popdd, roll_down, pop) + neato(popdd, rolldown, pop) .. parsed-literal:: @@ -1651,7 +1651,7 @@ also get the effect of combinators in some limited cases. .. code:: ipython2 # Reverse the order of the top three items. - neato(roll_up, swap) + neato(rollup, swap) .. parsed-literal:: @@ -1753,8 +1753,8 @@ comments. We can write a function to check that: popdd = (a3 a2 a1 -- a2 a1) popop = (a2 a1 --) rest = ([a1 .1.] -- [.1.]) - roll_down = (a1 a2 a3 -- a2 a3 a1) - roll_up = (a1 a2 a3 -- a3 a1 a2) + rolldown = (a1 a2 a3 -- a2 a3 a1) + rollup = (a1 a2 a3 -- a3 a1 a2) rrest = ([a0 a1 .0.] -- [.0.]) second = ([a0 a1 .0.] -- a1) swap = (a1 a2 -- a2 a1) @@ -1873,13 +1873,10 @@ conversion function instead. This is programmer's laziness. name: (sequence_to_stack(i), sequence_to_stack(o)) for name, (i, o) in DEFS.iteritems() } - + NEW_DEFS['stack'] = S[0], (S[0], S[0]) + NEW_DEFS['swaack'] = (S[1], S[0]), (S[0], S[1]) globals().update(NEW_DEFS) -.. code:: ipython2 - - stack = S[0], (S[0], S[0]) - .. code:: ipython2 C(stack, uncons) @@ -1984,12 +1981,14 @@ Clunky junk, but it will suffice for now. popop = (a2 a1 --) pred = (n1 -- n2) rest = ([a1 .1.] -- [.1.]) - roll_down = (a1 a2 a3 -- a2 a3 a1) - roll_up = (a1 a2 a3 -- a3 a1 a2) + rolldown = (a1 a2 a3 -- a2 a3 a1) + rollup = (a1 a2 a3 -- a3 a1 a2) rrest = ([a0 a1 .0.] -- [.0.]) second = ([a0 a1 .0.] -- a1) sqrt = (n0 -- n1) + stack = (... -- ... [...]) succ = (n1 -- n2) + swaack = ([.1.] -- [.0.]) swap = (a1 a2 -- a2 a1) swons = ([.0.] a0 -- [a0 .0.]) third = ([a0 a1 a2 .0.] -- a2) @@ -2686,14 +2685,159 @@ as a Joy interpreter stack, and just execute combinators directly. We can hybridize the compostition function with an interpreter to evaluate combinators, compose non-combinator functions, and put type variables on the stack. For combinators like ``branch`` that can have more than one -stack effect we have to "split universes" again and return both. (Note: -bug! If one branch doesn't type check the currect code ignores it, so -you can think things are okay but have a type error waiting in the faled -branch, I think... D'oh! FIXME!!!) +stack effect we have to "split universes" again and return both. .. code:: ipython2 - stack_concat = lambda q, e: (q[0], stack_concat(q[1], e)) if q else e + class FunctionJoyType(AnyJoyType): + + def __init__(self, name, sec, number): + self.name = name + self.stack_effects = sec + self.number = number + + def __add__(self, other): + return self + __radd__ = __add__ + + def __repr__(self): + return self.name + + + class SymbolJoyType(FunctionJoyType): prefix = 'F' + class CombinatorJoyType(FunctionJoyType): prefix = 'C' + + + + +.. code:: ipython2 + + def flatten(g): + return list(chain.from_iterable(g)) + + + ID = S[0], S[0] # Identity function. + + + def infer(e, F=ID): + if not e: + return [F] + + n, e = e + + if isinstance(n, SymbolJoyType): + res = flatten(infer(e, Fn) for Fn in MC([F], n.stack_effects)) + + elif isinstance(n, CombinatorJoyType): + res = [] + for combinator in n.stack_effects: + fi, fo = F + new_fo, ee, _ = combinator(fo, e, {}) + ee = update(FUNCTIONS, ee) # Fix Symbols. + new_F = fi, new_fo + res.extend(infer(ee, new_F)) + else: + lit = s9, (n, s9) + res = flatten(infer(e, Fn) for Fn in MC([F], [lit])) + + return res + + + +.. code:: ipython2 + + f0, f1, f2, f3, f4, f5, f6, f7, f8, f9 = F = map(FloatJoyType, _R) + i0, i1, i2, i3, i4, i5, i6, i7, i8, i9 = I = map(IntJoyType, _R) + n0, n1, n2, n3, n4, n5, n6, n7, n8, n9 = N + s0, s1, s2, s3, s4, s5, s6, s7, s8, s9 = S + +.. code:: ipython2 + + import joy.library + + FNs = '''ccons cons divmod_ dup dupd first + over pm pop popd popdd popop pred + rest rolldown rollup rrest second + sqrt stack succ swaack swap swons + third tuck uncons''' + + FUNCTIONS = { + name: SymbolJoyType(name, [NEW_DEFS[name]], i) + for i, name in enumerate(FNs.strip().split()) + } + FUNCTIONS['sum'] = SymbolJoyType('sum', [(((Ns[1], s1), s0), (n0, s0))], 100) + FUNCTIONS['mul'] = SymbolJoyType('mul', [ + ((i2, (i1, s0)), (i3, s0)), + ((f2, (i1, s0)), (f3, s0)), + ((i2, (f1, s0)), (f3, s0)), + ((f2, (f1, s0)), (f3, s0)), + ], 101) + FUNCTIONS.update({ + combo.__name__: CombinatorJoyType(combo.__name__, [combo], i) + for i, combo in enumerate(( + joy.library.i, + joy.library.dip, + joy.library.dipd, + joy.library.dipdd, + joy.library.dupdip, + joy.library.b, + joy.library.x, + joy.library.infra, + )) + }) + + def branch_true(stack, expression, dictionary): + (then, (else_, (flag, stack))) = stack + return stack, CONCAT(then, expression), dictionary + + def branch_false(stack, expression, dictionary): + (then, (else_, (flag, stack))) = stack + return stack, CONCAT(else_, expression), dictionary + + FUNCTIONS['branch'] = CombinatorJoyType('branch', [branch_true, branch_false], 100) + +.. code:: ipython2 + + globals().update(FUNCTIONS) + +.. code:: ipython2 + + from itertools import chain + from joy.utils.stack import list_to_stack as l2s + +.. code:: ipython2 + + expression = l2s([n1, n2, (mul, s2), (stack, s3), dip, infra, first]) + +.. code:: ipython2 + + expression + + + + +.. parsed-literal:: + + (n1, (n2, ((mul, s2), ((stack, s3), (dip, (infra, (first, ()))))))) + + + +.. code:: ipython2 + + expression = l2s([n1, n2, mul]) + +.. code:: ipython2 + + infer(expression) + + + + +.. parsed-literal:: + + [] + + .. code:: ipython2 @@ -2770,7 +2914,7 @@ For this to work the type label classes have to be modified to let .. code:: ipython2 - F = reduce(C, (pop, swap, roll_down, rest, rest, cons, cons)) + F = reduce(C, (pop, swap, rolldown, rest, rest, cons, cons)) print doc_from_stack_effect(*F) @@ -2780,22 +2924,22 @@ For this to work the type label classes have to be modified to let --------------------------------------------------------------------------- - ValueError Traceback (most recent call last) + TypeError Traceback (most recent call last) - in () - 1 F = reduce(C, (pop, swap, roll_down, rest, rest, cons, cons)) + in () + 1 F = reduce(C, (pop, swap, rolldown, rest, rest, cons, cons)) 2 ----> 3 print doc_from_stack_effect(*F) - in C(f, g) + in C(f, g) 10 def C(f, g): 11 f, g = relabel(f, g) ---> 12 for fg in compose(f, g): 13 yield delabel(fg) - in compose(f, g) + in compose(f, g) 1 def compose(f, g): ----> 2 (f_in, f_out), (g_in, g_out) = f, g 3 s = unify(g_in, f_out) @@ -2803,14 +2947,14 @@ For this to work the type label classes have to be modified to let 5 raise TypeError('Cannot unify %r and %r.' % (f_out, g_in)) - in C(f, g) + in C(f, g) 10 def C(f, g): 11 f, g = relabel(f, g) ---> 12 for fg in compose(f, g): 13 yield delabel(fg) - in compose(f, g) + in compose(f, g) 1 def compose(f, g): ----> 2 (f_in, f_out), (g_in, g_out) = f, g 3 s = unify(g_in, f_out) @@ -2818,14 +2962,14 @@ For this to work the type label classes have to be modified to let 5 raise TypeError('Cannot unify %r and %r.' % (f_out, g_in)) - in C(f, g) + in C(f, g) 10 def C(f, g): 11 f, g = relabel(f, g) ---> 12 for fg in compose(f, g): 13 yield delabel(fg) - in compose(f, g) + in compose(f, g) 1 def compose(f, g): ----> 2 (f_in, f_out), (g_in, g_out) = f, g 3 s = unify(g_in, f_out) @@ -2833,14 +2977,14 @@ For this to work the type label classes have to be modified to let 5 raise TypeError('Cannot unify %r and %r.' % (f_out, g_in)) - in C(f, g) + in C(f, g) 10 def C(f, g): 11 f, g = relabel(f, g) ---> 12 for fg in compose(f, g): 13 yield delabel(fg) - in compose(f, g) + in compose(f, g) 1 def compose(f, g): ----> 2 (f_in, f_out), (g_in, g_out) = f, g 3 s = unify(g_in, f_out) @@ -2848,14 +2992,14 @@ For this to work the type label classes have to be modified to let 5 raise TypeError('Cannot unify %r and %r.' % (f_out, g_in)) - in C(f, g) + in C(f, g) 10 def C(f, g): 11 f, g = relabel(f, g) ---> 12 for fg in compose(f, g): 13 yield delabel(fg) - in compose(f, g) + in compose(f, g) 1 def compose(f, g): ----> 2 (f_in, f_out), (g_in, g_out) = f, g 3 s = unify(g_in, f_out) @@ -2863,7 +3007,22 @@ For this to work the type label classes have to be modified to let 5 raise TypeError('Cannot unify %r and %r.' % (f_out, g_in)) - ValueError: need more than 1 value to unpack + in C(f, g) + 10 def C(f, g): + 11 f, g = relabel(f, g) + ---> 12 for fg in compose(f, g): + 13 yield delabel(fg) + + + in compose(f, g) + 1 def compose(f, g): + ----> 2 (f_in, f_out), (g_in, g_out) = f, g + 3 s = unify(g_in, f_out) + 4 if not s: + 5 raise TypeError('Cannot unify %r and %r.' % (f_out, g_in)) + + + TypeError: 'SymbolJoyType' object is not iterable .. code:: ipython2 diff --git a/joy/utils/polytypes.py b/joy/utils/polytypes.py index 335f38b..a878f2b 100644 --- a/joy/utils/polytypes.py +++ b/joy/utils/polytypes.py @@ -2,7 +2,7 @@ Multiple Stack Effects -By adjusting the machinery in types.py to handles lists of stackeffect comments +By adjusting the machinery in types.py to handles lists of stack effect comments we can capture more information about the type signatures of some functions, and we can introduce a kind of Kleene Star or sequence type that can stand for an unbounded sequence of other types. @@ -13,6 +13,7 @@ from itertools import chain, product import sys sys.path.append('/home/sforman/Desktop/Joypy-hg') import joy.library +from joy.parser import Symbol from joy.utils.stack import concat as CONCAT from joy.utils.types import ( AnyJoyType, A, @@ -125,12 +126,11 @@ def unify(u, v, s=None): return _lil_uni(u, v, s) if isinstance(u, tuple) and isinstance(v, tuple): - if len(u) != len(v) != 2: - raise JoyTypeError(repr((u, v))) + if len(u) != 2 or len(v) != 2: + raise JoyTypeError('Cannot unify %r and %r.' % (u, v)) - a, b = v + (a, b), (c, d) = v, u if isinstance(a, KleeneStar): - c, d = u if isinstance(c, KleeneStar): s = _lil_uni(a, c, s) # Attempt to unify the two K-stars. return unify(d, b, s[0]) @@ -147,20 +147,13 @@ def unify(u, v, s=None): sn.update(s) return t - a, b = u - if isinstance(a, KleeneStar): - s0 = unify(v, b) - s1 = unify(v, (a.another(), u)) - t = s0 + s1 + if isinstance(c, KleeneStar): + t = unify(v, d) + unify(v, (c.another(), u)) for sn in t: - sn.update(s) + sn.update(s) return t - ses = unify(u[0], v[0], s) - results = () - for sn in ses: - results += unify(u[1], v[1], sn) - return results + return tuple(flatten(unify(d, b, sn) for sn in unify(c, a, s))) if isinstance(v, tuple): if not stacky(u): @@ -174,7 +167,7 @@ def unify(u, v, s=None): s[v] = u return s, - return () + return _lil_uni(u, v, s) def _lil_uni(u, v, s): @@ -214,7 +207,8 @@ def MC(F, G): return res -flatten = lambda g: list(chain.from_iterable(g)) +def flatten(g): + return list(chain.from_iterable(g)) ID = S[0], S[0] # Identity function. @@ -256,25 +250,23 @@ Ns = map(NumberStarJoyType, _R) Ss = map(StackStarJoyType, _R) -mul = [ - ((i2, (i1, s0)), (i3, s0)), - ((f2, (i1, s0)), (f3, s0)), - ((i2, (f1, s0)), (f3, s0)), - ((f2, (f1, s0)), (f3, s0)), -] - - FUNCTIONS = { name: SymbolJoyType(name, [DEFS[name]], i) for i, name in enumerate(''' ccons cons divmod_ dup dupd first - mul over pm pop popd popdd popop - pred rest rolldown rollup rrest - second sqrt succ swap swons third - tuck uncons stack swaack + over pm pop popd popdd popop pred + rest rolldown rollup rrest second + sqrt stack succ swaack swap swons + third tuck uncons '''.strip().split()) } FUNCTIONS['sum'] = SymbolJoyType('sum', [(((Ns[1], s1), s0), (n0, s0))], 100) +FUNCTIONS['mul'] = SymbolJoyType('mul', [ + ((i2, (i1, s0)), (i3, s0)), + ((f2, (i1, s0)), (f3, s0)), + ((i2, (f1, s0)), (f3, s0)), + ((f2, (f1, s0)), (f3, s0)), +], 101) FUNCTIONS.update({ combo.__name__: CombinatorJoyType(combo.__name__, [combo], i) for i, combo in enumerate(( @@ -300,6 +292,52 @@ def branch_false(stack, expression, dictionary): FUNCTIONS['branch'] = CombinatorJoyType('branch', [branch_true, branch_false], 100) +globals().update(FUNCTIONS) + +def _ge(self, other): + return (issubclass(other.__class__, self.__class__) + or hasattr(self, 'accept') + and isinstance(other, self.accept)) + +AnyJoyType.__ge__ = _ge +AnyJoyType.accept = tuple, int, float, long, str, unicode, bool, Symbol +StackJoyType.accept = tuple +if __name__ == '__main__': + from joy.parser import text_to_expression + from joy.utils.stack import list_to_stack as l2s + + + F = infer(l2s((pop, pop, pop))) + for f in F: + print doc_from_stack_effect(*f) + s = text_to_expression('0 1 2') + L = unify(s, F[0][0]) + print L + + print + + F = infer(l2s((pop, swap, rolldown, rest, rest, cons, cons))) + for f in F: + print doc_from_stack_effect(*f) + s = text_to_expression('0 1 2 [3 4]') + L = unify(s, F[0][0]) + print L + print + + g = update(L[0], F[0]) + print doc_from_stack_effect(*g) + print g + + + print '- - - - - -' + s = text_to_expression('[3 4]') + L = unify(s, F[0][1]) + print L + print + + g = update(L[0], F[0]) + print doc_from_stack_effect(*g) + print g diff --git a/joy/utils/types.py b/joy/utils/types.py index 1bcd73b..dc10c13 100644 --- a/joy/utils/types.py +++ b/joy/utils/types.py @@ -186,7 +186,7 @@ def _f(term, switch): while term and isinstance(term, tuple): item, term = term a.append(item) - assert isinstance(term, StackJoyType), repr(term) + assert isinstance(term, (tuple, StackJoyType)), repr(term) a = [_to_str(i, term, switch) for i in a] return a @@ -206,10 +206,11 @@ def _to_str(term, stack, switch): while term and isinstance(term, tuple): item, term = term a.append(_to_str(item, stack, switch)) - assert isinstance(term, StackJoyType), repr(term) + assert isinstance(term, (tuple, StackJoyType)), repr(term) if term == stack: switch[0] = True - end = '...' + end = '' if term == () else '...' + #end = '...' else: end = '...%i' % term.number a.append(end) diff --git a/test/test_type_inference.py b/test/test_type_inference.py index a60fa54..5645545 100644 --- a/test/test_type_inference.py +++ b/test/test_type_inference.py @@ -18,7 +18,7 @@ class TestMixin(object): self.assert_(a >= b) self.assert_(b >= a) # Check type variables match expected pattern. - self._compare_structures(a, b) + self._compare_structures(b, a) def _compare_structures(self, a, b, seen=None): # Sometimes we change ONLY the "number" attr of our type vars. @@ -33,12 +33,12 @@ class TestMixin(object): self._compare_structures(aa, bb, seen) else: if a in seen: - self.assertIs(b, seen[a]) + self.assertEqual(b, seen[a]) seen[a] = b class TestCombinators(TestMixin, unittest.TestCase): - + # def setUp(self): # def tearDown(self): @@ -76,9 +76,19 @@ class TestCombinators(TestMixin, unittest.TestCase): (mul, s2), infra ] - f = (s0, ((n0, (n1, s1)), s2)) - # (-- [n0 n1 ...1]) Two numbers in a stack. - self.assertEqualTypeStructure(infr(expression), [f]) + f = [ + (s1, ((f1, (n1, s2)), s3)), # (-- [f1 n1 ...2]) + (s1, ((i1, (n1, s2)), s3)), # (-- [i1 n1 ...2]) + ] + self.assertEqualTypeStructure(infr(expression), f) + + def test_nullary(self): + expression = n1, n2, (mul, s2), (stack, s3), dip, infra, first + f = [ + (s1, (f1, (n1, (n2, s2)))), # (-- n2 n1 f1) + (s1, (i1, (n1, (n2, s2)))), # (-- n2 n1 i1) + ] + self.assertEqualTypeStructure(infr(expression), f) def test_x(self): expression = (a1, (swap, ((dup, s2), (dip, s0)))), x @@ -129,6 +139,17 @@ class TestYin(TestMixin, unittest.TestCase): f = (s0, ((a0, s0), (a1, s1))) # (-- a1 [a0 ...0]) self.assertEqualTypeStructure(infr(expression), [f]) + def test_z_down(self): + expression = s2, swap, uncons, swap + f = (((a1, s1), s2), (a1, (s1, (s3, s2)))) + # ([a1 ...1] -- [...3] [...1] a1) + self.assertEqualTypeStructure(infr(expression), [f]) + + def test_z_right(self): + expression = a1, a2, (swons, s3), cons, dip, uncons, swap + f = ((s1, s2), (a1, (s3, ((a2, s1), s2)))) + # ([...1] -- [a2 ...1] [...3] a1) + self.assertEqualTypeStructure(infr(expression), [f]) ## def test_(self): ## expression = pop, swap, rolldown, rest, rest, cons, cons