How to assign a delegate to a var ?

bioinfornatics via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Jun 3 08:14:04 PDT 2014


On Tuesday, 3 June 2014 at 15:00:05 UTC, Ali Çehreli wrote:
> 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


The only reason that is because i do nor know how to do:

  @attribute( (int a) => a == 42 )
  int x;

without using a delegate, with a function that will not work as  
(int a) => a == 42 is a delegate no ?

struct attribute
{
     public bool function( int ) predicate;
     public this(  bool function( int ) pred )
     {
         predicate = pred;
     }
}





More information about the Digitalmars-d-learn mailing list