Type inference of Joy expressions.

More remains to be done but it seems to work.
This commit is contained in:
Simon Forman
2018-06-29 13:19:12 -07:00
parent 6ca59847ab
commit 4406a6620b
25 changed files with 1867 additions and 4593 deletions
+27 -25
View File
@@ -5,9 +5,6 @@ from joy.utils.polytypes import *
from joy.utils.stack import list_to_stack as __
infr = lambda e: infer(__(e))
globals().update(FUNCTIONS)
@@ -51,29 +48,34 @@ class TestCombinators(TestMixin, unittest.TestCase):
((s0, (a0, s1)), ((a0, s0), s1)), # (a0 [...0] -- [a0 ...0])
((a0, s0), (a0, (a0, s0))), # (a0 -- a0 a0)
]
self.assertEqualTypeStructure(infr(expression), f)
self.assertEqualTypeStructure(infer(*expression), f)
def test_concat(self):
expression = (swons, s3), (a4, s0), concat_
f = (s1, ((swons, (a1, s1)), s1)) # (... -- ... [swons a1 ...])
self.assertEqualTypeStructure(infer(*expression), [f])
def test_dip(self):
expression = dip,
f = ((s1, (a1, s2)), (a2, s2)) # (a1 [...1] -- a2)
self.assertEqualTypeStructure(infr(expression), [f])
self.assertEqualTypeStructure(infer(*expression), [f])
def test_cons_dip(self):
expression = (cons, s0), dip # [cons] dip
# (a2 [...1] a1 -- [a2 ...1] a1)
f = (a1, (s1, (a2, s2))), (a1, ((a2, s1), s2))
self.assertEqualTypeStructure(infr(expression), [f])
self.assertEqualTypeStructure(infer(*expression), [f])
def test_cons_dipd(self):
expression = a1, a3, (cons, s0), dipd
f = ((s0, (a0, s1)), (a1, (a2, ((a0, s0), s1))))
# (a0 [...0] -- [a0 ...0] a2 a1)
self.assertEqualTypeStructure(infr(expression), [f])
self.assertEqualTypeStructure(infer(*expression), [f])
def test_i(self):
# [cons] i == cons
expression = (cons, s0), i
self.assertEqualTypeStructure(infr(expression), infr([cons]))
self.assertEqualTypeStructure(infer(*expression), infer(cons))
def test_infra(self):
expression = [
@@ -85,7 +87,7 @@ class TestCombinators(TestMixin, unittest.TestCase):
(s1, ((f1, (n1, s2)), s3)), # (-- [f1 n1 ...2])
(s1, ((i1, (n1, s2)), s3)), # (-- [i1 n1 ...2])
]
self.assertEqualTypeStructure(infr(expression), f)
self.assertEqualTypeStructure(infer(*expression), f)
def test_nullary(self):
expression = n1, n2, (mul, s2), (stack, s3), dip, infra, first
@@ -95,27 +97,27 @@ class TestCombinators(TestMixin, unittest.TestCase):
(s1, (f1, (i1, (f2, s1)))), # (-- f2 i1 f1)
(s1, (i1, (i2, (i3, s1)))), # (-- i3 i2 i1)
]
self.assertEqualTypeStructure(infr(expression), f)
self.assertEqualTypeStructure(infer(*expression), f)
expression = n1, n2, (mul, s2), nullary
self.assertEqualTypeStructure(infr(expression), f)
self.assertEqualTypeStructure(infer(*expression), f)
def test_nullary_too(self):
expression = (stack, s3), dip, infra, first
f = ((s1, (a1, s2)), (a1, (a1, s2))) # (a1 [...1] -- a1 a1)
self.assertEqualTypeStructure(infr(expression), [f])
self.assertEqualTypeStructure(infer(*expression), [f])
expression = nullary,
f = ((s1, (a1, s2)), (a1, (a1, s2))) # (a1 [...1] -- a1 a1)
# Something's not quite right here...
e = infr(expression)
self.assertEqualTypeStructure(infr(expression), [f])
# e = infer(*expression)
self.assertEqualTypeStructure(infer(*expression), [f])
def test_x(self):
expression = (a1, (swap, ((dup, s2), (dip, s0)))), x
expression = (a1, (swap, ((dup, s2), (dip, s1)))), x
f = (s0, ((a0, (swap, ((dup, s1), (dip, s2)))), (a1, (a1, s0))))
# (-- a1 a1 [a0 swap [dup ...1] dip ...2])
self.assertEqualTypeStructure(infr(expression), [f])
self.assertEqualTypeStructure(infer(*expression), [f])
class TestKleeneStar(TestMixin, unittest.TestCase):
@@ -126,7 +128,7 @@ class TestKleeneStar(TestMixin, unittest.TestCase):
(s1, ((a1, s2), s1)), # (-- [a1 ...2])
(s1, ((a1, s2), (As[1], (a2, s1)))), # (-- a2 a1* [a1 ...2])
]
self.assertEqualTypeStructure(infr(expression), f)
self.assertEqualTypeStructure(infer(*expression), f)
def test_sum(self):
expression = [
@@ -135,7 +137,7 @@ class TestKleeneStar(TestMixin, unittest.TestCase):
]
# A function that puts a single number on the stack.
f = s0, (n0, s0)
self.assertEqualTypeStructure(infr(expression), [f])
self.assertEqualTypeStructure(infer(*expression), [f])
def test_no_infinite_loop(self):
expression = [
@@ -144,7 +146,7 @@ class TestKleeneStar(TestMixin, unittest.TestCase):
]
# A function that puts a single number on the stack.
f = s0, (n0, s0)
self.assertEqualTypeStructure(infr(expression), [f])
self.assertEqualTypeStructure(infer(*expression), [f])
class TestYin(TestMixin, unittest.TestCase):
@@ -153,31 +155,31 @@ class TestYin(TestMixin, unittest.TestCase):
expression = pop, swap, rolldown, rest, rest, cons, cons
# ([a3 a4 ...0] a2 a1 a0 -- [a1 a2 ...0])
f = (a0, (a1, (a2, ((a3, (a4, s0)), s1)))), ((a1, (a2, s0)), s1)
self.assertEqualTypeStructure(infr(expression), [f])
self.assertEqualTypeStructure(infer(*expression), [f])
def test_swaack(self):
expression = a0, (a1, s0), swaack
f = (s0, ((a0, s0), (a1, s1))) # (-- a1 [a0 ...0])
self.assertEqualTypeStructure(infr(expression), [f])
self.assertEqualTypeStructure(infer(*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])
self.assertEqualTypeStructure(infer(*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])
self.assertEqualTypeStructure(infer(*expression), [f])
## def test_(self):
## expression = pop, swap, rolldown, rest, rest, cons, cons
## f =
## for sec in infr(expression):
## for sec in infer(*expression):
## print sec, doc_from_stack_effect(*sec)
## self.assertEqualTypeStructure(infr(expression), [f])
## self.assertEqualTypeStructure(infer(*expression), [f])
## for g in MC(dup, mul):
## print doc_from_stack_effect(*g)