How to assign a delegate to a var ?
Ali Çehreli via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Tue Jun 3 08:00:05 PDT 2014
On 06/03/2014 05:57 AM, bioinfornatics wrote:
> On Tuesday, 3 June 2014 at 12:27:45 UTC, bioinfornatics wrote:
>>>> I would like store the delegate to another var but when i try i
>>>> get:
>>>>
>>>>
>>>> testTraitsWithDelegate.d(13): Error: expression template
>>>> __lambda2 is void and has no value
>>>>
>>>> I do not want to run it only to save the «function» somewhere.
> ------------- code -----------
> import std.stdio;
> import std.typecons : Tuple;
> //~ import std.functional : toDelegate;
> //~ struct attribute( alias Pred )
> //~ {
> //~ public:
> //~ alias Predicate = Pred;
> //~ }
>
> struct attribute
> {
> public bool delegate( int ) predicate;
> public this( bool delegate( int ) pred )
> {
> predicate = pred;
> }
> }
>
> struct Data
> {
> @attribute( (int a) => a == 42 )
> int x;
> }
>
>
>
> void main()
> {
>
> bool delegate( int ) tmp;
>
> pragma( msg, __traits(getAttributes, Data.x)[0] );
> pragma( msg, __traits(getAttributes, Data.x)[0].predicate( 42 ) );
>
> pragma( msg, __traits(getAttributes,
Data.x)[0].predicate.stringof );
> tmp = __traits(getAttributes, Data.x)[0].predicate;
> writeln( tmp(42 ) );
> //~tmp = toDelegate(__traits(getAttributes, Data.x)[0].Predicate);
> }
> ----------------------------------
>
>
>
>
> give at compile time this:
>
> attribute(function (int a) => a == 42)
> true
> (attribute __ctmp1474;
> , __ctmp1474).this(function (int a) => a == 42).predicate
>
>
> And segfault at run-time
A delegate has a context pointer that it uses when executing at
run-time. However, there can't be a run-time context of a delegate that
is created at compile-time. I think that is why the segfault.
Is there a reason why it needs to be a delegate?
Replacing every 'delegate' with 'function' makes your code work.
Ali
More information about the Digitalmars-d-learn
mailing list