%%% %%% Static and dynamic typing %%% % dynamically typed languages allow the definition of generic % procedures, e.g., the identity combinator: declare fun {Id X} X end {Browse {Id 5}} {Browse {Id Id}} % however, dynamically typed languages cannot detect some program % errors at compile time, e.g.: declare fun {ShiftRight L} 0|L end {Browse {ShiftRight 4}} % unintended missuse {Browse {ShiftRight [4]}} % proper use %%% %%% Encapsulated stateful ADT %%% declare fun {NewCounter I} S = {NewCell I} proc {Inc} S := @S + 1 end proc {Dec} S := @S - 1 end fun {Get} @S end proc {Put I} S := I end proc {Display} {Browse @S} end in o(inc:Inc dec:Dec get:Get put:Put display:Display) end declare C1 C2 C1 = {NewCounter 0} C2 = {NewCounter 100} {C1.inc} {C1.display} {C2.dec} {C2.display} %%% %%% Parameter passing mechanisms %%% % Call by reference declare Sqr in proc {Sqr A ?B} B=A*A end local I in {Sqr 25 I} {Browse I} end % Call by variable declare Sqr in proc {Sqr A} A:=@A*@A end local I = {NewCell 0} in I := 25 {Sqr I} {Browse @I} end % Call by value declare Sqr in proc {Sqr A} C = {NewCell A} in C := @C + 1 {Browse @C*@C} end {Sqr 25} local I = 25 in {Sqr I} {Browse I} end local I = {NewCell 0} in I := 25 {Sqr @I} {Browse @I} end % Call by value passing a cell declare Sqr in proc {Sqr A} C = {NewCell @A} in C := @C + 1 {Browse @C*@C} end local I = {NewCell 0} in I := 25 {Sqr I} {Browse @I} end % Call by value-result declare Sqr in proc {Sqr A} D = {NewCell @A} in D := @D * @D A := @D end local C = {NewCell 0} in C := 25 {Sqr C} {Browse @C} end % Call by value-result example with concurrency declare Sqr in proc {Sqr A} D = {NewCell @A} in D := @D + 1 % this intermediate result is never visible outside D := @D * @D A := @D end local C = {NewCell 0} in C := 25 thread {Browse @C} end % can display 25 or 676 (never 26) {Sqr C} {Browse @C} end local C = {NewCell 0} in C := 25 thread {Browse @C} end % can display 25 or 676 (never 26) {Delay 5000} {Sqr C} {Browse @C} end % Call by name declare Sqr in proc {Sqr A} {A} := @{A} * @{A} end local C = {NewCell 0} in C := 25 {Sqr fun {$} C end} {Browse @C} end % Call by need declare Sqr in proc {Sqr A} B = {A} % only if argument used!! in B := @B * @B end local C = {NewCell 0} in C := 25 {Sqr fun {$} C end} {Browse @C} end