--- /dev/null
+
+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.
+