print := λ(: ctx FContext). (: (tail(
(print 'Fragment\sContext:\n_s)
(while (non-zero ctx) (match ctx (
()
( (FCtxBind( rst k kt kf )) (tail(
(print k)(print '\s:\s_s)(print kt)(print '\n_s)(print kf)
(set ctx rst)
)))
)))
)) Nil);
fragment-context::new := λ. (: (tail(
(let r FCtxEOF)
r
)) FContext);
fragment-context::lookup := λ(: ctx FContext)(: k String)(: kt Type)(: sloc AST). (: (tail(
(let r (fragment::new()))
(let found False_u8)
(while (non-zero ctx) (match ctx (
()
( (FCtxBind( rst rk rt rf )) (
(if (==( k rk )) (
(match (slot( rt 'Arrow_s )) (
()
( (TGround( 'Arrow_s (TypeSeq( (TypeSeq( TypeEOF domaint )) ranget )) )) (
(if (can-unify( domaint kt )) (tail(
(set r rf)
(set found True_u8)
(set ctx FCtxEOF)
)) (set ctx rst))
))
( _ (tail(
(set r rf)
(set found True_u8)
(set ctx FCtxEOF)
)))
))
) (
(set ctx rst)
))
))
)))
(if (==( found True_u8 )) () (tail(
(print 'Context::lookup\s_s)(print k)(print '\s:\s_s)(print kt)(print '\n_s)
(exit-error( 'Context::lookup\sCould\sNot\sFind\sSymbol_s sloc ))
)))
r
)) Fragment);
fragment-context::bind := λ(: ctx FContext)(: k String)(: kt Type)(: f Fragment). (: (tail(
(let new-ctx (FCtxBind(
(close ctx)
k kt f
)))
new-ctx
)) FContext);