Jump to content

Jensen's Device: Difference between revisions

Added zkl
(Added zkl)
Line 1,051:
}
puts [sum2 1 100 {i {expr {1.0/$i}}}] ;# 5.177377517639621</lang>
 
=={{header|zkl}}==
zkl doesn't support call by name/address but does have reference objects. Using an explicit call to term:
<lang zkl>fcn sum(ri, lo,hi, term){
temp:=0.0; ri.set(lo);
do{ temp += term(ri); } while(ri.inc() < hi); // inc return previous value
return(temp);
}
print("%f\n".fmt(sum(Ref(0), 1,100, fcn(ri){ 1.0 / ri.value })));</lang>
Using function application/deferred(lazy) objects, we can make the function call implicit (addition forces evaluation of the LHS):
<lang zkl>fcn sum2(ri, lo,hi, term){
temp:=0.0; ri.set(lo);
do{ temp=term+temp; } while(ri.inc() < hi); // inc return previous value
return(temp);
}
ri:=Ref(0);
print("%f\n".fmt(sum2(ri, 1,100, 'wrap(){ 1.0 / ri.value })));</lang>
In this case, we can call sum or sum2 and it does the same thing (the ri parameter will be ignored).
 
Of course, as others have pointed out, this can be expressed very simply:
<lang zkl>fcn sum3(lo,hi, term){ [lo..hi].reduce('wrap(sum,i){sum+term(i) },0.0) }
print("%f\n".fmt(sum3(1,100, fcn(i){ 1.0 / i })));</lang>
{{out}}
<pre>
5.187378
5.187378
5.187378
</pre>
 
{{omit from|GUISS}}
Anonymous user
Cookies help us deliver our services. By using our services, you agree to our use of cookies.