Re: Lambda cannot access frame of function

2017-11-18 Thread Ali Çehreli via Digitalmars-d-learn

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


Re: Lambda cannot access frame of function

2017-11-18 Thread Adam D. Ruppe via Digitalmars-d-learn

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.


Re: Lambda cannot access frame of function

2017-11-18 Thread kerdemdemir via Digitalmars-d-learn
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.


Lambda cannot access frame of function

2017-11-18 Thread kerdemdemir via Digitalmars-d-learn

//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