Idea: "Frozen" inner function

David Medlock noone at nowhere.com
Tue Nov 28 05:26:57 PST 2006


Michael Butscher wrote:
> David Medlock wrote:
> 
> [What are closures?]
> 
>>In my understanding, closures are like functions which carry state along 
>>with them.  Like objects but with only a single method: opCall().
>>
>>in Lua syntax:
>>
>>function make_adder()
>>   local sum = 0;
>>   return function(n) sum = sum + n; return sum; end
>>end
> 
> 
> What happens while the outer function is "alive" yet?
> 
> E.g. something like (I don't know Lua, therefore I guessed syntax):

As a testament to Lua, you guessed correctly...
Javascript 1.5 syntax is very similar.
> 
> function test()
>    local sum = 0;
>    local x = function(n) sum = sum + n; return sum; end
>    sum = 5;
>    print(x(5));
> end
> 
> 
> Does this print 5 or 10?
> 
> 
> 
> Michael

When a stack frame is collected, upvalues(sum) are copied into the 
closure x.  Sum will outlive the function test(), but won't be copied 
until you leave.

I ran this in Lua 5.1:
 > test()
10

Obviously you need your copy semantics defined well to use them.  This 
is why several functional languages make variables copy-on-write.  For 
python this would be tuples, you can only make a new one not overwrite 
the old one.


-DavidM



More information about the Digitalmars-d mailing list