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