Jensen's Device: Difference between revisions

+Icon+Unicon
(complex code, rounded result to simpler code and real result)
(+Icon+Unicon)
Line 272:
main = print foo</lang>
Output: 5.187377517639621
 
== Icon and Unicon ==
Traditional call by name and reference are not features of Icon/Unicon. Procedures parameters are passed by value (immutable types) and reference (mutable types). However, a similar effect may be accomplished by means of co-expressions. The example below was selected for cleanliness of calling.
==={{header|Icon}}===
<lang Icon>record mutable(value) # record wrapper to provide mutable access to immutable types
 
procedure main()
A := mutable()
write( sum(A, 1, 100, create 1.0/A.value) )
end
 
procedure sum(A, lo, hi, term)
temp := 0
every A.value := lo to hi do
temp +:= @^term
return temp
end</lang>
 
Refreshing the co-expression above is more expensive to process but to avoid it requires unary alternation in the call.
<lang Icon> write( sum(A, 1, 100, create |1.0/A.value) )
...
temp +:= @term</lang>
 
Alternately, we can use a programmer defined control operator (PDCO) approach that passes every argument as a co-expression. Again the refresh co-expression/unary iteration trade-off can be made. The call is cleaner looking but the procedure code is less clear. Additionally all the parameters are passed as individual co-expressions.
<lang Icon> write( sum{A.value, 1, 100, 1.0/A.value} )
...
procedure sum(X)
...
every @X[1] := @X[2] to @X[3] do
temp +:= @^X[4]</lang>
 
==={{header|Unicon}}===
This Icon solution works in Unicon.
 
=={{header|J}}==
Anonymous user