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