Thread overview | ||||||
---|---|---|---|---|---|---|
|
November 18, 2017 Lambda cannot access frame of function | ||||
---|---|---|---|---|
| ||||
//DMD64 D Compiler 2.072.2 import std.stdio; bool foo( bool function( double ) controlFoo ) { return controlFoo(5.0); } void foo2( double val ) { writeln ( foo( a => a > val ) ); } void main() { foo2(20); writeln("Hello, World!"); } Does not compile and gives this errors: source_file.d(12): Error: function source.foo2.__lambda2 cannot access frame of function source.foo2 source_file.d(12): Error: function source.foo (bool function(double) controlFoo) is not callable using argument types (void) Live example: http://rextester.com/WRKCWR55408 Is there any workaround for that? Regards Erdem |
November 18, 2017 Re: Lambda cannot access frame of function | ||||
---|---|---|---|---|
| ||||
Posted in reply to kerdemdemir | On Saturday, 18 November 2017 at 14:22:19 UTC, kerdemdemir wrote:
> bool foo( bool function( double ) controlFoo )
Change that `function` to `delegate` and it should work.
Function pointers aren't allowed to access other locals, but delegates are.
|
November 18, 2017 Re: Lambda cannot access frame of function | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adam D. Ruppe | On Saturday, 18 November 2017 at 14:30:29 UTC, Adam D. Ruppe wrote:
> On Saturday, 18 November 2017 at 14:22:19 UTC, kerdemdemir wrote:
>> bool foo( bool function( double ) controlFoo )
>
> Change that `function` to `delegate` and it should work.
>
> Function pointers aren't allowed to access other locals, but delegates are.
Yes it worked as you suggested.
Thanks.
|
November 18, 2017 Re: Lambda cannot access frame of function | ||||
---|---|---|---|---|
| ||||
Posted in reply to kerdemdemir | On 11/18/2017 06:22 AM, kerdemdemir wrote:
> //DMD64 D Compiler 2.072.2
> import std.stdio;
>
> bool foo( bool function( double ) controlFoo )
> {
> return controlFoo(5.0);
> }
>
> void foo2( double val )
> {
> writeln ( foo( a => a > val ) );
> }
>
> void main()
> {
> foo2(20);
> writeln("Hello, World!");
> }
>
> Does not compile and gives this errors:
> source_file.d(12): Error: function source.foo2.__lambda2 cannot access frame of function source.foo2
foo should take 'delegate'.
If you want it to work with any callable entity, take the function as an alias template parameter:
bool foo(alias controlFoo)()
{
return controlFoo(5.0);
}
void foo2( double val )
{
writeln ( foo!( a => a > val )() );
}
Ali
|
Copyright © 1999-2021 by the D Language Foundation