why it said no identifier for declarator …

bioinfornatics via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Jun 4 03:12:02 PDT 2014


On Wednesday, 4 June 2014 at 00:07:35 UTC, Jesse Phillips wrote:
> On Tuesday, 3 June 2014 at 22:10:06 UTC, bioinfornatics wrote:
>> I do not see why it fail in debug output we see that tuple 
>> have a
>> field with given name.
>
> Your generated output (short and formatted)
>
>     alias TL = Tuple!(int,"x",  bool function( const ref string 
> ),
> "xStartsWith ", bool function( const ref string ), "xEndsWith ",
> int,"y",  bool function( const ref string ), "yStartsWith ", 
> bool
> function( const ref string ), "yEndsWith ");
>
>     TL.xStartsWith...
>
> TL is a type.
>
>     TL variable;
>     variable.xStartsWith...


after a tmeplate update

--------------------------------
template toTuple(T){
     static string maker(){
         string assignFunction = "TL tl; ";
         string statement      = "alias TL = Tuple!(";
         foreach(const memberName; __traits(allMembers, T)){
             mixin(`alias f = Filter!(isSection, 
__traits(getAttributes, T.` ~ memberName ~ `));`);
             if( f.length == 1 )
             {
                 statement   ~= typeof(__traits(getMember, T, 
memberName)).stringof  ~ ",\"" ~ memberName ~ "\", "
                             ~ " bool function( const ref string 
), \"" ~ memberName ~ "StartsWith\","
                             ~ " bool function( const ref string 
), \"" ~ memberName ~ "EndsWith\", " ;
                 assignFunction ~= "tl." ~ memberName ~ 
"StartsWith = __traits(getAttributes, T." ~ memberName ~ 
")[0].startsWith; "
                                ~  "tl." ~ memberName ~ "EndsWith  
  = __traits(getAttributes, T." ~ memberName ~ ")[0].endsWith; ";
             }
         }
         statement = statement[0..$-2] ~ ") ;" ; // $-2 to remove 
extra comma
         return statement~assignFunction~ "alias toTuple = tl;";
     }
     pragma( msg, maker() );
     mixin( maker() );
}

--------------------------------


which generate this string:

alias TL = Tuple!(int,"x",  bool function( const ref string ), 
"xStartsWith", bool function( const ref string ), "xEndsWith", 
int,"y",  bool function( const ref string ), "yStartsWith", bool 
function( const ref string ), "yEndsWith") ;
TL tl;
tl.xStartsWith = __traits(getAttributes, T.x)[0].startsWith;
tl.xEndsWith   = __traits(getAttributes, T.x)[0].endsWith;
tl.yStartsWith = __traits(getAttributes, T.y)[0].startsWith;
tl.yEndsWith   = __traits(getAttributes, T.y)[0].endsWith;
alias toTuple = tl;



This produce an error at mixin step:

attribute.d-mixin-62(62): Error: no identifier for declarator 
tl.xStartsWith
attribute.d-mixin-62(62): Error: Declaration expected, not '='
attribute.d-mixin-62(62): Error: no identifier for declarator 
tl.xEndsWith
attribute.d-mixin-62(62): Error: Declaration expected, not '='
attribute.d-mixin-62(62): Error: no identifier for declarator 
tl.yStartsWith
attribute.d-mixin-62(62): Error: Declaration expected, not '='
attribute.d-mixin-62(62): Error: no identifier for declarator 
tl.yEndsWith
attribute.d-mixin-62(62): Error: Declaration expected, not '='
;


More information about the Digitalmars-d-learn mailing list