www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Lambda cannot access frame of function

reply kerdemdemir <kerdemdemir gmail.com> writes:
//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
Nov 18
next sibling parent reply Adam D. Ruppe <destructionator gmail.com> writes:
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.
Nov 18
parent kerdemdemir <kerdemdemir gmail.com> writes:
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.
Nov 18
prev sibling parent =?UTF-8?Q?Ali_=c3=87ehreli?= <acehreli yahoo.com> writes:
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
Nov 18