Closures/Value capture: Difference between revisions

Lingo added
(These tasks, Multiple distinct objects and Closures/Value capture, have some similarities)
(Lingo added)
Line 1,023:
 
</lang>
 
=={{header|Lingo}}==
 
Lingo doesn't really support closures. But with the limitations described at [https://www.rosettacode.org/wiki/Function_composition#Lingo Function composition] and based on the fact that Lingo allows to create arbitrary code at runtime, the task can be solved like this:
 
<lang lingo>-- parent script "CallFunction"
 
property _code
 
on new (me, code)
me._code = code
return me
end
 
on call (me)
----------------------------------------
-- If custom arguments were passed, evaluate them in the current context.
-- Note: in the code passed to the constructor they have to be specied as
-- arg[1], arg[2], ...
arg = []
repeat with i = 3 to the paramCount
arg[i-2] = param(i)
end repeat
----------------------------------------
res = VOID
do(me._code)
return res
end</lang>
 
<lang lingo>funcs = []
repeat with i = 1 to 10
code = "res="&i&"*"&i
funcs[i] = script("CallFunction").new(code)
end repeat
 
put call(funcs[3], _movie)
-- 9</lang>
 
Since the original task is a little trivial in terms of not depending on runtime arguments, here also a solution for an extended task: let each function[i] return the square of i plus the sum of all arguments passed to it at runtime:
 
<lang lingo>funcs = []
repeat with i = 1 to 10
code = ""
put "res = "&i&"*"&i &RETURN after code
put "repeat with i = 1 to arg.count" &RETURN after code
put " res = res + arg[i]" &RETURN after code
put "end repeat" &RETURN after code
funcs[i] = script("CallFunction").new(code)
end repeat
 
put call(funcs[3], _movie, 23)
-- 32
 
put call(funcs[7], _movie, 4, 5, 6)
-- 64</lang>
 
=={{header|Logtalk}}==
Anonymous user