diff --git a/docs/Types.ipynb b/docs/Types.ipynb index 35e858f..a220b3f 100644 --- a/docs/Types.ipynb +++ b/docs/Types.ipynb @@ -499,6 +499,8 @@ " s[u] = v\n", " elif isinstance(v, int):\n", " s[v] = u\n", + " else:\n", + " s = False\n", "\n", " return s" ] @@ -884,6 +886,8 @@ " s = unify(a, c, s)\n", " if s != False:\n", " s = unify(b, d, s)\n", + " else:\n", + " s = False\n", "\n", " return s" ] diff --git a/docs/notebook_preamble.pyc b/docs/notebook_preamble.pyc deleted file mode 100644 index 32b6331..0000000 Binary files a/docs/notebook_preamble.pyc and /dev/null differ diff --git a/joy/library.py b/joy/library.py index c3e00c7..13176c5 100644 --- a/joy/library.py +++ b/joy/library.py @@ -94,7 +94,6 @@ definitions = ('''\ of == swap at product == 1 swap [*] step flatten == [] swap [concat] step -unit == [] cons quoted == [unit] dip unquoted == [i] dip enstacken == stack [clear] dip @@ -120,13 +119,14 @@ range_to_zero == unit [down_to_zero] infra anamorphism == [pop []] swap [dip swons] genrec range == [0 <=] [1 - dup] anamorphism while == swap [nullary] cons dup dipd concat loop -dudipd == dup dipd +dupdipd == dup dipd primrec == [i] genrec step_zero == 0 roll> step codireco == cons dip rest cons make_generator == [codireco] ccons -ccons == cons cons ''' +##ccons == cons cons +##unit == [] cons ##second == rest first ##third == rest rest first ##swons == swap cons @@ -572,12 +572,12 @@ def clear(stack): ## return second, (tos, stack) -@inscribe -@SimpleFunctionWrapper -def swaack(stack): - '''swap stack''' - old_stack, stack = stack - return stack, old_stack +##@inscribe +##@SimpleFunctionWrapper +##def swaack(stack): +## '''swap stack''' +## old_stack, stack = stack +## return stack, old_stack ##@inscribe diff --git a/joy/utils/generated_library.py b/joy/utils/generated_library.py index a6a2051..08c9285 100644 --- a/joy/utils/generated_library.py +++ b/joy/utils/generated_library.py @@ -5,55 +5,55 @@ def _Tree_add_Ee(stack): """ :: - ([a3 a4 ...0] a2 a1 a0 -- [a1 a2 ...0]) + ([a4 a5 ...1] a3 a2 a1 -- [a2 a3 ...1]) """ - (a0, (a1, (a2, ((a3, (a4, s0)), s1)))) = stack - return ((a1, (a2, s0)), s1) + (a1, (a2, (a3, ((a4, (a5, s1)), s2)))) = stack + return ((a2, (a3, s1)), s2) def _Tree_delete_R0(stack): """ :: - ([a1 ...0] a0 -- [a1 ...0] a1 a0 a0) + ([a2 ...1] a1 -- [a2 ...1] a2 a1 a1) """ - (a0, ((a1, s0), s1)) = stack - return (a0, (a0, (a1, ((a1, s0), s1)))) + (a1, ((a2, s1), s2)) = stack + return (a1, (a1, (a2, ((a2, s1), s2)))) def _Tree_delete_clear_stuff(stack): """ :: - (a2 a1 [a0 ...0] -- [...0]) + (a3 a2 [a1 ...1] -- [...1]) """ - ((a0, s0), (a1, (a2, s1))) = stack - return (s0, s1) + ((a1, s1), (a2, (a3, s2))) = stack + return (s1, s2) def _Tree_get_E(stack): """ :: - ([a2 a3 ...0] a1 a0 -- a3) + ([a3 a4 ...1] a2 a1 -- a4) """ - (a0, (a1, ((a2, (a3, s0)), s1))) = stack - return (a3, s1) + (a1, (a2, ((a3, (a4, s1)), s2))) = stack + return (a4, s2) def ccons(stack): """ :: - (a1 a0 [...0] -- [a1 a0 ...0]) + (a2 a1 [...1] -- [a2 a1 ...1]) """ - (s0, (a0, (a1, s1))) = stack - return ((a1, (a0, s0)), s1) + (s1, (a1, (a2, s2))) = stack + return ((a2, (a1, s1)), s2) def cons(stack): @@ -115,22 +115,22 @@ def first_two(stack): """ :: - ([a0 a1 ...0] -- a0 a1) + ([a1 a2 ...1] -- a1 a2) """ - ((a0, (a1, s0)), s1) = stack - return (a1, (a0, s1)) + ((a1, (a2, s1)), s2) = stack + return (a2, (a1, s2)) def fourth(stack): """ :: - ([a0 a1 a2 a3 ...0] -- a3) + ([a1 a2 a3 a4 ...1] -- a4) """ - ((a0, (a1, (a2, (a3, s0)))), s1) = stack - return (a3, s1) + ((a1, (a2, (a3, (a4, s1)))), s2) = stack + return (a4, s2) def over(stack): @@ -247,22 +247,22 @@ def rrest(stack): """ :: - ([a0 a1 ...0] -- [...0]) + ([a1 a2 ...1] -- [...1]) """ - ((a0, (a1, s0)), s1) = stack - return (s0, s1) + ((a1, (a2, s1)), s2) = stack + return (s1, s2) def second(stack): """ :: - ([a0 a1 ...0] -- a1) + ([a1 a2 ...1] -- a2) """ - ((a0, (a1, s0)), s1) = stack - return (a1, s1) + ((a1, (a2, s1)), s2) = stack + return (a2, s2) def stack(stack): @@ -280,22 +280,33 @@ def stuncons(stack): """ :: - (... a0 -- ... a0 a0 [...]) + (... a1 -- ... a1 a1 [...]) """ - (a0, s0) = stack - return (s0, (a0, (a0, s0))) + (a1, s1) = stack + return (s1, (a1, (a1, s1))) def stununcons(stack): """ :: - (... a1 a0 -- ... a1 a0 a0 a1 [...]) + (... a2 a1 -- ... a2 a1 a1 a2 [...]) """ - (a0, (a1, s0)) = stack - return (s0, (a1, (a0, (a0, (a1, s0))))) + (a1, (a2, s1)) = stack + return (s1, (a2, (a1, (a1, (a2, s1))))) + + +def swaack(stack): + """ + :: + + ([...1] -- [...0]) + + """ + (s1, s0) = stack + return (s0, s1) def swap(stack): @@ -313,22 +324,22 @@ def swons(stack): """ :: - ([...0] a0 -- [a0 ...0]) + ([...1] a1 -- [a1 ...1]) """ - (a0, (s0, s1)) = stack - return ((a0, s0), s1) + (a1, (s1, s2)) = stack + return ((a1, s1), s2) def third(stack): """ :: - ([a0 a1 a2 ...0] -- a2) + ([a1 a2 a3 ...1] -- a3) """ - ((a0, (a1, (a2, s0))), s1) = stack - return (a2, s1) + ((a1, (a2, (a3, s1))), s2) = stack + return (a3, s2) def tuck(stack): @@ -353,13 +364,24 @@ def uncons(stack): return (s0, (a1, s23)) +def unit(stack): + """ + :: + + (a1 -- [a1 ]) + + """ + (a1, s23) = stack + return ((a1, ()), s23) + + def unswons(stack): """ :: - ([a0 ...0] -- [...0] a0) + ([a1 ...1] -- [...1] a1) """ - ((a0, s0), s1) = stack - return (a0, (s0, s1)) + ((a1, s1), s2) = stack + return (a1, (s1, s2)) diff --git a/joy/utils/polytypes.py b/joy/utils/polytypes.py index d6df74d..beada70 100644 --- a/joy/utils/polytypes.py +++ b/joy/utils/polytypes.py @@ -256,8 +256,6 @@ def infer(e, F=ID): a0, a1, a2, a3, a4, a5, a6, a7, a8, a9 = A n0, n1, n2, n3, n4, n5, n6, n7, n8, n9 = N s0, s1, s2, s3, s4, s5, s6, s7, s8, s9 = S -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) _R = range(1, 11) As = map(AnyStarJoyType, _R) diff --git a/joy/utils/types.py b/joy/utils/types.py index dc10c13..20f26a2 100644 --- a/joy/utils/types.py +++ b/joy/utils/types.py @@ -30,6 +30,7 @@ class AnyJoyType(object): return hash(repr(self)) +class BooleanJoyType(AnyJoyType): prefix = 'b' class NumberJoyType(AnyJoyType): prefix = 'n' class FloatJoyType(NumberJoyType): prefix = 'f' class IntJoyType(FloatJoyType): prefix = 'i' @@ -41,12 +42,6 @@ class StackJoyType(AnyJoyType): return False -_R = range(10) -A = a0, a1, a2, a3, a4, a5, a6, a7, a8, a9 = map(AnyJoyType, _R) -N = n0, n1, n2, n3, n4, n5, n6, n7, n8, n9 = map(NumberJoyType, _R) -S = s0, s1, s2, s3, s4, s5, s6, s7, s8, s9 = map(StackJoyType, _R) - - class JoyTypeError(Exception): pass @@ -212,7 +207,7 @@ def _to_str(term, stack, switch): end = '' if term == () else '...' #end = '...' else: - end = '...%i' % term.number + end = '' if term == () else '...%i' % term.number a.append(end) return '[%s]' % ' '.join(a) @@ -238,43 +233,62 @@ def __(*seq): return stack +_R = range(10) +A = a0, a1, a2, a3, a4, a5, a6, a7, a8, a9 = map(AnyJoyType, _R) +B = b0, b1, b2, b3, b4, b5, b6, b7, b8, b9 = map(BooleanJoyType, _R) +N = n0, n1, n2, n3, n4, n5, n6, n7, n8, n9 = map(NumberJoyType, _R) +S = s0, s1, s2, s3, s4, s5, s6, s7, s8, s9 = map(StackJoyType, _R) +F = f0, f1, f2, f3, f4, f5, f6, f7, f8, f9 = F = map(FloatJoyType, _R) +I = i0, i1, i2, i3, i4, i5, i6, i7, i8, i9 = I = map(IntJoyType, _R) + + def defs(): - rolldown = __(a1, a2, a3), __(a2, a3, a1) - rollup = __(a1, a2, a3), __(a3, a1, a2) - pop = __(a1), __() - popop = __(a2, a1,), __() - popd = __(a2, a1,), __(a1) - popdd = __(a3, a2, a1,), __(a2, a1,) - popopd = __(a3, a2, a1,), __(a1) - popopdd = __(a4, a3, a2, a1,), __(a2, a1) - swap = __(a1, a2), __(a2, a1) - rest = __((a1, s0),), __(s0,) - rrest = C(rest, rest) cons = __(a1, s0), __((a1, s0),) ccons = C(cons, cons) - uncons = __((a1, s0),), __(a1, s0) - unswons = C(uncons, swap) - swons = C(swap, cons) dup = __(a1,), __(a1, a1) dupd = __(a2, a1), __(a2, a2, a1) dupdd = __(a3, a2, a1), __(a3, a3, a2, a1) first = __((a1, s1),), __(a1,) - second = C(rest, first) - third = C(rest, second) - fourth = C(rest, third) - tuck = __(a2, a1), __(a1, a2, a1) over = __(a2, a1), __(a2, a1, a2) + pop = __(a1), __() + popd = __(a2, a1,), __(a1) + popdd = __(a3, a2, a1,), __(a2, a1,) + popop = __(a2, a1,), __() + popopd = __(a3, a2, a1,), __(a1) + popopdd = __(a4, a3, a2, a1,), __(a2, a1) + rest = __((a1, s0),), __(s0,) + rolldown = __(a1, a2, a3), __(a2, a3, a1) + rollup = __(a1, a2, a3), __(a3, a1, a2) + rrest = C(rest, rest) + second = C(rest, first) stack = s0, (s0, s0) swaack = (s1, s0), (s0, s1) + swap = __(a1, a2), __(a2, a1) + swons = C(swap, cons) + third = C(rest, second) + tuck = __(a2, a1), __(a1, a2, a1) + uncons = __((a1, s0),), __(a1, s0) + unswons = C(uncons, swap) stuncons = C(stack, uncons) stununcons = C(stack, uncons, uncons) - first_two = C(uncons, uncons, pop) + unit = __(a1), __((a1, ())) - mul = __(n1, n2), __(n3,) + eq = ge = gt = le = lt = ne = __(n1, n2), __(b1) + + and_ = __(b1, b2), __(b3) + bool_ = not_ = __(a1), __(b1) + + + + add = div = floordiv = modulus = mul = pow_ = sub = truediv = \ + lshift = rshift = __(n1, n2), __(n3,) sqrt = C(dup, mul) - succ = pred = __(n1,), __(n2,) + succ = pred = neg = __(n1,), __(n2,) divmod_ = pm = __(n2, n1), __(n4, n3) + first_two = C(uncons, uncons, pop) + fourth = C(rest, third) + _Tree_add_Ee = C(pop, swap, rolldown, rrest, ccons) _Tree_get_E = C(popop, second) _Tree_delete_clear_stuff = C(rollup, popop, rest)