declare C={NewCell 0} {Browse C} {Browse [val @C]} {Exchange C 2 1} declare fun {Reverse Xs} Rs={NewCell nil} in for X in Xs do Rs := X|@Rs end @Rs end {Browse {Reverse [1 2 3 4]}} declare fun {Reverse Xs} {FoldL Xs fun {$ Z E} E|Z end nil} % {FoldR Xs fun {$ E Z} NewZ in Z=E|NewZ NewZ end $ nil} end {Browse {Reverse [1 2 3 4]}} %------------------ declare C={NewCell 1} D={NewCell 2} proc {Swap X0 Y0} X={NewCell @X0} Y={NewCell @Y0} in X:=@X + @Y Y:=@X - @Y X:=@X - @Y X0:=@X Y0:=@Y end in {Browse [@C @D]} {Swap C D} {Browse [@C @D]} {Swap C C} {Browse [@C @C]} %----Call by ref ------- declare proc {ParamTest X} X=5 end Z in {Show Z} {ParamTest Z} %5 {Show Z} %----Call by name ------- declare X=3 fun {P X Y} {Y} end fun {Q X Y} {X} end in {Browse {Q fun {$} 2 end fun {$} X end}} declare proc {Sqr A} {A}:=@{A} * @{A} end local C={NewCell 5} in {Sqr fun {$} C end} {Browse @C} end %----Call by need ---- declare proc {Sqr A0} A={NewCell @A0} in {A}:=@{A} * @{A} end local C={NewCell 5} in {Sqr fun {$} C end} % can be implemented with lazy functions {Browse @C} end