%%% %%% 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 %%% %%% 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 %%% %%% On cells %%% % example 1 declare X = {NewCell 0} {Assign X 5} Y = X {Assign Y 10} {Browse {Access X} == 10} {Browse X == Y} % example 2 declare X = {NewCell 10} Y = {NewCell 10} {Browse X == Y} {Browse {Access X} == {Access Y}} % example 3 declare X = {NewCell 0} {Assign X 5} Y = X {Assign Y 10} {Browse X == 10} % returns false {Browse {Access X} == 10} % returns true % please fix slide 26 of Sections3.7,6.4.ppt: % you may also remove it, since examples 1 and 3 are identical. % inherited bug in slides!