E: V | A | C
NC: ";" = [] | ";" m:NL = m
FC: ";" = [] | ";" m:FL = m
EC: ";" = [] | ";" m:EL = m
NL: NAME | o:NAME m:NC = Cons o m
FL: E | o:E | m:FC = Cons o m
EL: E | EC  | o:E m:EC = Cons o m
V: v:V = Verb v [] [] | v:V r:E = Verb v [] r
A: a:A = Adverb a [] [] | v:A r:E = Adverb v [] r
C: N | c:N a:C = Call c a | l:N a:A = Adverb a l [] | l:N v:V = Verb v l []
     | l:N a:A r:E = Adverb a l r | l:N v:V r:E = Verb v l r
N: NAME | S | HEX | L | D | F
D: "[" "]" = [] | "["  l:EL "]" = Dict l
L: "(" ")" = [] | "([" c:NL "]" m:FL ")" = Table c m | "(" l:EL ")" = List l
F: "{" "}" = Lambda [] [] [] | "{[" c:NL "]" m:EL "}" = Lambda [] c m
                             | "{" m:EL "}" = Lambda [] [] m

lazy n (Assign n b)       e k = D n b (ContAssign n k)
     n (Cond v a l)       e k = D n v (ContCond l r k)
     n (List l)           e k = eve n l e k
     n (Call c a)         e k = D n a (ContCall c k)
     n (Verb v (Num _) r) e k = D n r (ContVerb v l 0 k)
     n (Verb v _ (Num _)) e k = D n v (ContVerb v r 1 k)
     n (Verb v x y)       e k = D n x (ContVerb v y 0 k)
     n (Name s)           e k = cont (lookup n s e) k
     n (Lambda _ x y)     e k = cont ((Lambda n x y) n) k

evf  n (Lambda c x y) a e k = cont (y (if (= c []) n c)) (ContFunc x a k)
     n       (Name s) a e k = lookup n s e
eve  n       (Cons a d) e k = D n a (ContExpr d k)
     n              Nil e k = cont n Nil e k
     n                a e k = D n a k
emr            (Dict x) e k = R Dict (rev x)
             (Cons x y) e k = R Dict (Cons (rev x) (rev x))
                      a e k = R a
run  D              n a e k = lazy n a e k
     R                a     = a

cont n (Dict v) e (ContCall c k)          = evf n c v e k
     n x        e (ContCall c k)          = evf n c x e k
     n x        e (ContFunc s a k)        = eve (e.define_args s (rev a)) v k
     n False    e (ContCond l r k)        = D n r k
     n True     e (ContCond l r k)        = D n l k
     n x        e (ContCond l r k)        = D n x (ContCond l r k)
     n x        e (ContAssign (Name s) k) = eve n (e.define s x) k
     n x        e (ContExpr (Cons a d) k) = eve n (Cons a d) k
     n x        e (ContExpr r k)          = cont n x k
     n x        e  ContRet                = emr x e k