% Intro to Oz {Browse 9999*9999} declare fun {Square X} X*X end {Browse {Square 9999}} declare Square = fun {$ X} X*X end {Browse {Square 6}} {Browse {fun {$ X} X*X end 5}} declare Increment = fun {$ X} X+1 end {Browse {Increment 5}} declare Increment = proc {$ X Y} Y = X+1 end {Browse {Increment 5 $}} % Function composition combinator: declare Compose = fun {$ F G} fun {$ X} {F {G X}} end end declare PlusOneSquared = {Compose Square Increment} {Browse {PlusOneSquared 5}} declare SquaredPlusOne = {Compose Increment Square} {Browse {SquaredPlusOne 5}} % Scope of variables local X = 2 in local F = fun {$ X} X * X % these refer to the argument to F end in {Browse {F X}} % this occurrence of X refers to 2 end end %%% Combinators % Identity combinator declare I = fun {$ X} X end {Browse {I 5}} {Browse {I Square}} % Application combinator declare App = fun {$ F X} {F X} end {Browse {App Square 7}} % Sequencing combinator, Z should not appear free in Y declare Seq = fun {$ X Y} { fun {$ Z} Y end X } end {Browse {Seq 3 4}} % Curry as combinator declare Curry = fun {$ F} fun {$ X} fun {$ Y} {F X Y} end end end declare ComposeC = {Curry Compose} declare IncrementC = {ComposeC Increment} declare SquaredPlusOne = {IncrementC Square} declare SquaredPlusOne = {{ComposeC Increment} Square} {Browse {SquaredPlusOne 4}} declare IncTwice = {IncrementC Increment} {Browse {IncTwice 5}} {Browse {{IncrementC fun {$ X} X+2 end} 4}}