type AST ASTEOF | ASTNil | (App( AST[] , AST[] )) | (Var( String )) | (Lit( String )) | (Abs( AST[] , AST[] ))
| (Seq( AST[] , AST[] )) | (Glb( String , AST[] )) | (ASTType( AST[] , AST[] )) | (Fragment( AST[] , AST[] ));
ast-tokenized-program := (: SNil S);
ast-parsed-program := (: ASTEOF AST);
non-zero := λ(: t AST). (: (tail(
(let r 1_u64)
(match t (
()
( ASTEOF (set r 0_u64))
( _ () )
))
r
)) U64);
close := λ(: x AST). (: (tail(
(mov( (malloc(sizeof AST)) R8 ))
(mov( x 0_u64 (as R8 AST[]) ))
(as R8 AST[])
)) AST[]);
print := λ(: t AST). (: (tail(
(match t (
()
( ASTEOF (print 'EOF_s) )
( ASTNil (print '\[\]_s) )
( (Var a) (print a) )
( (Lit a) (tail( (print '\`_s) (print a) )))
( (ASTType( lhs rhs )) (tail(
(print 'type\s_s)
(print lhs)
(print '\s=\s_s)
(print rhs)
)))
( (Glb( k v )) (tail(
(print k)
(print '\s:=\s_s)
(print v)
)))
( (Fragment( k v )) (tail(
(print 'fragment\s_s)
(print k)
(print '\s:=\s_s)
(print v)
)))
( (App( l r )) (tail(
(print '\[_s)
(print l)
(print '\s_s)
(print r)
(print '\]_s)
)))
( (Abs( lhs rhs )) (tail(
(print '\[_s)
(print '\l_s)
(print lhs)
(print '._s)
(print rhs)
(print '\]_s)
)))
( (Seq( l r )) (tail(
(print l)
(print '\:\n_s)
(print r)
)))
))
()
)) Nil);
serialize-ast := λ(: t AST). (: (tail(
(match t (
()
( ASTEOF (print '\[\]_s) )
( ASTNil (print 'Nil_s) )
( (Var a) (tail(
(print '\[Variable\s_s)
(print a)
(print '\]_s)
)))
( (Lit a) (tail(
(print '\[Literal\s_s)
(print a)
(print '\]_s)
)))
( (ASTType( lhs rhs )) (tail(
(print '\[Type\s\[_s)
(serialize-ast lhs)
(print '\s_s)
(serialize-ast rhs)
(print '\]\]_s)
)))
( (Glb( lhs rhs )) (tail(
(print '\[Global\s\[_s)
(print lhs)
(print '\s_s)
(serialize-ast rhs)
(print '\]\]_s)
)))
( (Fragment( lhs rhs )) (tail(
(print '\[Fragment\s\[_s)
(serialize-ast lhs)
(print '\s_s)
(serialize-ast rhs)
(print '\]\]_s)
)))
( (App( lhs rhs )) (tail(
(print '\[App\s\[_s)
(serialize-ast lhs)
(print '\s_s)
(serialize-ast rhs)
(print '\]\]_s)
)))
( (Abs( lhs rhs )) (tail(
(print '\[Lambda\s\[_s)
(serialize-ast lhs)
(print '\s_s)
(serialize-ast rhs)
(print '\]\]_s)
)))
( (Seq( ASTEOF r )) (tail(
(serialize-ast r)
(print '\n_s)
)))
( (Seq( l r )) (tail(
(serialize-ast l)
(serialize-ast r)
(print '\n_s)
)))
))
()
)) Nil);