%%% %%% 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) {Delay 1000} {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