lambda_mountain 1.13.53

Compiler Backend / Programming Language Scaffolding
Documentation

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);