173 lines
2.4 KiB
ReStructuredText
173 lines
2.4 KiB
ReStructuredText
|
|
Type Checking
|
|
=============
|
|
|
|
.. code:: ipython2
|
|
|
|
import logging, sys
|
|
|
|
logging.basicConfig(
|
|
format='%(message)s',
|
|
stream=sys.stdout,
|
|
level=logging.INFO,
|
|
)
|
|
|
|
.. code:: ipython2
|
|
|
|
from joy.utils.polytypes import (
|
|
doc_from_stack_effect,
|
|
infer,
|
|
reify,
|
|
unify,
|
|
FUNCTIONS,
|
|
JoyTypeError,
|
|
)
|
|
|
|
.. code:: ipython2
|
|
|
|
D = FUNCTIONS.copy()
|
|
del D['product']
|
|
globals().update(D)
|
|
|
|
An Example
|
|
----------
|
|
|
|
.. code:: ipython2
|
|
|
|
fi, fo = infer(pop, swap, rolldown, rrest, ccons)[0]
|
|
|
|
|
|
.. parsed-literal::
|
|
|
|
25 (--) ∘ pop swap rolldown rrest ccons
|
|
28 (a1 --) ∘ swap rolldown rrest ccons
|
|
31 (a3 a2 a1 -- a2 a3) ∘ rolldown rrest ccons
|
|
34 (a4 a3 a2 a1 -- a2 a3 a4) ∘ rrest ccons
|
|
37 ([a4 a5 ...1] a3 a2 a1 -- a2 a3 [...1]) ∘ ccons
|
|
40 ([a4 a5 ...1] a3 a2 a1 -- [a2 a3 ...1]) ∘
|
|
|
|
|
|
.. code:: ipython2
|
|
|
|
print doc_from_stack_effect(fi, fo)
|
|
|
|
|
|
.. parsed-literal::
|
|
|
|
([a4 a5 ...1] a3 a2 a1 -- [a2 a3 ...1])
|
|
|
|
|
|
.. code:: ipython2
|
|
|
|
from joy.parser import text_to_expression
|
|
from joy.utils.stack import stack_to_string
|
|
|
|
|
|
.. code:: ipython2
|
|
|
|
e = text_to_expression('0 1 2 [3 4]') # reverse order
|
|
print stack_to_string(e)
|
|
|
|
|
|
.. parsed-literal::
|
|
|
|
[3 4] 2 1 0
|
|
|
|
|
|
.. code:: ipython2
|
|
|
|
u = unify(e, fi)[0]
|
|
u
|
|
|
|
|
|
|
|
|
|
.. parsed-literal::
|
|
|
|
{a1: 0, a2: 1, a3: 2, a4: 3, a5: 4, s2: (), s1: ()}
|
|
|
|
|
|
|
|
.. code:: ipython2
|
|
|
|
g = reify(u, (fi, fo))
|
|
print doc_from_stack_effect(*g)
|
|
|
|
|
|
.. parsed-literal::
|
|
|
|
(... [3 4 ] 2 1 0 -- ... [1 2 ])
|
|
|
|
|
|
Unification Works "in Reverse"
|
|
------------------------------
|
|
|
|
.. code:: ipython2
|
|
|
|
e = text_to_expression('[2 3]')
|
|
|
|
.. code:: ipython2
|
|
|
|
u = unify(e, fo)[0] # output side, not input side
|
|
u
|
|
|
|
|
|
|
|
|
|
.. parsed-literal::
|
|
|
|
{a2: 2, a3: 3, s2: (), s1: ()}
|
|
|
|
|
|
|
|
.. code:: ipython2
|
|
|
|
g = reify(u, (fi, fo))
|
|
print doc_from_stack_effect(*g)
|
|
|
|
|
|
.. parsed-literal::
|
|
|
|
(... [a4 a5 ] 3 2 a1 -- ... [2 3 ])
|
|
|
|
|
|
Failing a Check
|
|
---------------
|
|
|
|
.. code:: ipython2
|
|
|
|
fi, fo = infer(dup, mul)[0]
|
|
|
|
|
|
.. parsed-literal::
|
|
|
|
25 (--) ∘ dup mul
|
|
28 (a1 -- a1 a1) ∘ mul
|
|
31 (f1 -- f2) ∘
|
|
31 (i1 -- i2) ∘
|
|
|
|
|
|
.. code:: ipython2
|
|
|
|
e = text_to_expression('"two"')
|
|
print stack_to_string(e)
|
|
|
|
|
|
.. parsed-literal::
|
|
|
|
'two'
|
|
|
|
|
|
.. code:: ipython2
|
|
|
|
try:
|
|
unify(e, fi)
|
|
except JoyTypeError, err:
|
|
print err
|
|
|
|
|
|
.. parsed-literal::
|
|
|
|
Cannot unify 'two' and f1.
|
|
|