dmd 2.029 release

Don nospam at nospam.com
Wed Apr 22 13:10:20 PDT 2009


Don wrote:
> bearophile wrote:
>> Don:
>>> Yes. Actually, marking a nested function as pure doesn't make much 
>>> sense.
>>> It's entirely equivalent to moving it outside the function; [...]
>>> I'm not sure that nested pure member functions should be legal.
>>
>> It's not fully equivalent to moving it out of the function because 
>> once you pull it out you add a name to the outer namespace: nested 
>> functions are useful to keep namespaces tidy too.
>> So I'd like to have nested pure functions too.
>>
>> pure int foo(int y) { return y + y; } // outer foo
>> pure void bar(int x) {
>>   pure int foo(int y) { return y * y; }
>>   return foo(x) * .foo(x);
>> }
>>
>> Thank you,
>> bye,
>> bearophile
> 
> That's true, but it seems quite difficult to get right. A pure nested 
> function can in theory access immutable members in the outer function -- 
> but must not access the parameters of the outer function.
> If there are no immutable members in the outer function, the compiler 
> would ideally convert it into an external pure function, so that it
> doesn't need a frame pointer to the outer function. But it would need 
> error messages for any use of mutable outer function members. Etc.
> It seems quite a lot of work for something of very limited use.
> Making it into a external, private pure function is almost the same.
> 
> 
Actually it's not so difficult. I've created a patch for bug 2807 -- 
it's only 5 lines long! It gives an error message if a nested pure 
function accesses a mutable variable from an outer scope.


More information about the Digitalmars-d-announce mailing list