Re: Template bug with second mixin?

2014-12-05 Thread Andre via Digitalmars-d-learn

thanks a lot. That makes sense.

Kind regards
André

On Friday, 5 December 2014 at 09:29:21 UTC, ketmar via 
Digitalmars-d-learn wrote:

On Fri, 05 Dec 2014 09:19:27 +
Andre via Digitalmars-d-learn 
 wrote:



I think I mimized the coding too much.
What I actually want to achieve is to generate read methods
in the structure for different data types  (Ubyte, short, int):

I thought the eponymous trick would insert the content of the
enum instead the name itself?

string getReadMethods(string methodName, string dataType)
{
   return dataType~` `~methodName~`(size_t idx) {
 return v_arr[idx].get!`~dataType~`; }`;
}

template insertReadMethods(string MethodName, DataType)
{
   enum insertReadMethods = getReadMethods(MethodName, 
DataType.stringof);

}

struct Data
{
mixin insertReadMethods!("readTinyInt", ubyte);
mixin insertReadMethods!("readShortInt", short);
}

void main(){}


you musunderstood how mixin templates works. mixin templates 
are more

like macroses than templates per se, so you don't need to assign
anything to enum to get the result. i.e.


string getReadMethods(string methodName, string dataType)
{
   return dataType~` `~methodName~`(size_t idx) {
 return v_arr[idx].get!`~dataType~`; }`;
}

template insertReadMethods(string MethodName, DataType)
{
   /*enum insertReadMethods =*/ // no need to do this
   // do that instead ;-)
   mixin(getReadMethods(MethodName, DataType.stringof));
}

struct Data
{
mixin insertReadMethods!("readTinyInt", ubyte);
mixin insertReadMethods!("readShortInt", short);
}


think about mixin templates as macro definitions which will be 
just

inserted where you instantiated them.




Re: Template bug with second mixin?

2014-12-05 Thread ketmar via Digitalmars-d-learn
On Fri, 05 Dec 2014 09:19:27 +
Andre via Digitalmars-d-learn  wrote:

> I think I mimized the coding too much.
> What I actually want to achieve is to generate read methods
> in the structure for different data types  (Ubyte, short, int):
> 
> I thought the eponymous trick would insert the content of the
> enum instead the name itself?
> 
> string getReadMethods(string methodName, string dataType)
> {
>return dataType~` `~methodName~`(size_t idx) {
>  return v_arr[idx].get!`~dataType~`; }`;
> }
> 
> template insertReadMethods(string MethodName, DataType)
> {
>enum insertReadMethods = getReadMethods(MethodName, 
> DataType.stringof);
> }
> 
> struct Data
> {
>   mixin insertReadMethods!("readTinyInt", ubyte);
>   mixin insertReadMethods!("readShortInt", short);
> }
> 
> void main(){}

you musunderstood how mixin templates works. mixin templates are more
like macroses than templates per se, so you don't need to assign
anything to enum to get the result. i.e.


string getReadMethods(string methodName, string dataType)
{
   return dataType~` `~methodName~`(size_t idx) {
 return v_arr[idx].get!`~dataType~`; }`;
}

template insertReadMethods(string MethodName, DataType)
{
   /*enum insertReadMethods =*/ // no need to do this
   // do that instead ;-)
   mixin(getReadMethods(MethodName, DataType.stringof));
}

struct Data
{
mixin insertReadMethods!("readTinyInt", ubyte);
mixin insertReadMethods!("readShortInt", short);
}


think about mixin templates as macro definitions which will be just
inserted where you instantiated them.


signature.asc
Description: PGP signature


Re: Template bug with second mixin?

2014-12-05 Thread Andre via Digitalmars-d-learn

I think I mimized the coding too much.
What I actually want to achieve is to generate read methods
in the structure for different data types  (Ubyte, short, int):

I thought the eponymous trick would insert the content of the
enum instead the name itself?

string getReadMethods(string methodName, string dataType)
{
  return dataType~` `~methodName~`(size_t idx) {
return v_arr[idx].get!`~dataType~`; }`;
}

template insertReadMethods(string MethodName, DataType)
{
  enum insertReadMethods = getReadMethods(MethodName, 
DataType.stringof);

}

struct Data
{
mixin insertReadMethods!("readTinyInt", ubyte);
mixin insertReadMethods!("readShortInt", short);
}

void main(){}


Kind regards
André

On Friday, 5 December 2014 at 07:28:26 UTC, ketmar via 
Digitalmars-d-learn wrote:

On Fri, 05 Dec 2014 07:06:34 +
Andre via Digitalmars-d-learn 
 wrote:



Hi,

following coding fails to compile with 2.066.0 and
2.067.0-b1.


This is a bug, or?
source\app.d(9): Error: mixin 
app.Data.insertReadMethods!("readTinyInt", ubyte)

is not defined

template insertReadMethods(string MethodName, DataType)
{
enum insertReadMethods = "";
}

struct Data
{
mixin insertReadMethods!("readTinyInt", ubyte);
mixin insertReadMethods!("readTinyInt", ubyte);
}

void main(){}
i.e. "mixin template" inserts it's names into the same scope, 
and
compiler searching symbols from innermost scope up to module 
scope.


here first mixin inserts 'enum' member, and searching for 
second mixin
hits that enum member. to avoid things going out of control 
compiler is
not trying to guess what you want but stops with error, giving 
you a

chance to fix the code.




Re: Template bug with second mixin?

2014-12-04 Thread ketmar via Digitalmars-d-learn
On Fri, 05 Dec 2014 07:06:34 +
Andre via Digitalmars-d-learn  wrote:

> Hi,
> 
> following coding fails to compile with 2.066.0 and
> 2.067.0-b1.
> 
> 
> This is a bug, or?
> source\app.d(9): Error: mixin 
> app.Data.insertReadMethods!("readTinyInt", ubyte)
> is not defined
> 
> template insertReadMethods(string MethodName, DataType)
> {
>   enum insertReadMethods = "";
> }
> 
> struct Data
> {
>   mixin insertReadMethods!("readTinyInt", ubyte);
>   mixin insertReadMethods!("readTinyInt", ubyte);
> }
> 
> void main(){}
i.e. "mixin template" inserts it's names into the same scope, and
compiler searching symbols from innermost scope up to module scope.

here first mixin inserts 'enum' member, and searching for second mixin
hits that enum member. to avoid things going out of control compiler is
not trying to guess what you want but stops with error, giving you a
chance to fix the code.


signature.asc
Description: PGP signature


Re: Template bug with second mixin?

2014-12-04 Thread ketmar via Digitalmars-d-learn
On Fri, 05 Dec 2014 07:06:34 +
Andre via Digitalmars-d-learn  wrote:

> Hi,
> 
> following coding fails to compile with 2.066.0 and
> 2.067.0-b1.
> 
> 
> This is a bug, or?
> source\app.d(9): Error: mixin 
> app.Data.insertReadMethods!("readTinyInt", ubyte)
> is not defined
> 
> template insertReadMethods(string MethodName, DataType)
> {
>   enum insertReadMethods = "";
> }
> 
> struct Data
> {
>   mixin insertReadMethods!("readTinyInt", ubyte);
>   mixin insertReadMethods!("readTinyInt", ubyte);
> }
> 
> void main(){}
not a bug. what you doing is actually:

  struct Data
  {
enum insertReadMethods = "";
mixin insertReadMethods!("readTinyInt", ubyte);
  }

`enum insertReadMethods` is definitely not a template, and compiler
correctly tells that to you.


signature.asc
Description: PGP signature


Template bug with second mixin?

2014-12-04 Thread Andre via Digitalmars-d-learn

Hi,

following coding fails to compile with 2.066.0 and
2.067.0-b1.


This is a bug, or?
source\app.d(9): Error: mixin 
app.Data.insertReadMethods!("readTinyInt", ubyte)

is not defined

template insertReadMethods(string MethodName, DataType)
{
enum insertReadMethods = "";
}

struct Data
{
mixin insertReadMethods!("readTinyInt", ubyte);
mixin insertReadMethods!("readTinyInt", ubyte);
}

void main(){}

Kind regards
André