-- LambdaCalc.russell open <* T: type ~ proc[T->T] , TRUE: T ~ lambda x:T in lambda y:T in x ni ni , FALSE: T ~ lambda x:T in lambda y:T in y ni ni , ZERO: T ~ lambda x:T in lambda y:T in y ni ni , ID: T ~ lambda x:T in x ni , printBoolValue: proc[T->[]] ~ lambda f:T in open < putTrue: T ~ lambda x:T in putString; x ni , putFalse: T ~ lambda x:T in putString; x ni > in (((f putTrue) putFalse) ID) ni ni , printNatValue: proc[T->[]] ~ lambda f:T in open ref[integer.val] | integer in open < sum ~ new<> > in assign; ((f lambda x:T in assign>; x ni) ID); putString; putString ni ni ni *> in open <* suc: T ~ lambda n:T in lambda s:T in lambda z:T in s (n s z) ni ni ni , fromInteger: func[ integer.val->T ] ~ lambda n: integer.val in if (integer.leq)?t => ZERO else suc(fromInteger(integer.-)) fi ni , plus: T ~ lambda n:T in lambda m:T in ((n suc) m) ni ni , times: T ~ lambda n:T in lambda m:T in ((n (plus m)) ZERO) ni ni , exp: T ~ lambda n:T in lambda m:T in ((m (times n)) (suc ZERO)) ni ni *> in printNatValue( (exp (fromInteger 2))(fromInteger 3) ) ni ni ÊB˜Jšœ˜šÏbœ˜Jšœœœ˜Jš œ œœœœœœ˜/Jš œ œœœœœœ˜0Jš œ œœœœœœ˜/Jšœœœœ˜šœœ œ˜+˜Jšœ œœ+œ˜IJšœœœ,˜IJšœ˜J˜Jš˜—Jšœ˜—šœœ œ˜*šœ˜"šœ˜J˜Jšœœœ-œ˜FJšœ6˜6Jšœ%˜%Jš˜—Jš˜—Jš˜—šœ˜šœ˜Jšœ œœœœœœ œœœ˜Gšœ œœ˜>Jšœ"œ&œœ˜U—Jš œ œœœœ œœ˜9Jš œ œœœœœœ˜BJš œ œœœœœ˜EJšœ˜Jšœ5˜5Jš˜——Jš˜——…—ð8