Problem with closures

Bradley Smith digitalmars-com at baysmith.com
Thu Jan 11 22:17:49 PST 2007


Using DMD 1.0, I get errors on the template.

closureWithTemplate.d(19): delegate 
closureWithTemplate.TAddN!(40).__dgliteral2 is a nested function and 
cannot be accessed from main
closureWithTemplate.d(6): Error: non-constant expression __dgliteral2


   Bradley

Chris Nicholson-Sauls wrote:
> Lutger wrote:
>> Alain wrote:
>>> Frits van Bommel Wrote:
>>>
>>>> Alain wrote:
>>>>> AddFunc addN(int n) {
>>>>>     int add(int i) {
>>>>>         return i + n;
>>>>>     }
>>>>>     return &add; // the add function captured will remember the 
>>>>> value of n
>>>>> }
>>>> [snip]
>>>>> Am i missing something?
>>>> You shouldn't return delegates to nested functions, just like you 
>>>> shouldn't return pointers to local variables.
>>>> Delegates to nested functions contain a pointer to the stack frame 
>>>> of the enclosing function. If that function has returned, the stack 
>>>> frame may be corrupted (especially if you have called another 
>>>> function, like apply(), since then).
>>>
>>> How come this compiles? Is it a bug ?
>>>
>>> Alain
>>
>> This is valid code. It is up to the programmer to make sure the 
>> delegate  doesn't use vars that are out of scope. There was some talk 
>> about this, to copy the 'evironment' for later use, it might be solved 
>> in the future.
>>
>> std.bind might be of use here.
> 
> As could a template.
> 
> <code>
> import std .stdio ;
> 
> alias int delegate(int n) AddFunc;
> 
> template TAddN (int N) {
>   const TAddN = (int i) { return i + N; } ;
> }
> 
> void apply (int[] array, AddFunc func) {
>   foreach (inout i; array) {
>     i = func(i);
>   }
> }
> 
> void main () {
>     int[] numbers = [1,2,3] ;
> 
>     writefln("numbers before = ", numbers);
>     apply(numbers, TAddN!(40));
>     writefln("numbers after = ", numbers);
> }
> </code>
> 
> -- Chris Nicholson-Sauls


More information about the Digitalmars-d-learn mailing list