digitalmars.D.learn - mixin alias
- Derek Parnell (15/15) Dec 16 2007 Is there any reason why the alias template parameter cannot be a literal...
- 0ffh (3/18) Dec 16 2007 regards, frank
- Aarti (6/21) Dec 16 2007 IMHO should work...
- Jarrett Billingsley (26/36) Dec 16 2007 This is correct. You can only alias things that have names; the number ...
- Derek Parnell (8/55) Dec 16 2007 I know that is 'correct', but I was really asking what is the rationale
- Derek Parnell (13/53) Dec 16 2007 Why? If you had such a template (one that used 'side effects') but suppl...
- 0ffh (6/18) Dec 16 2007 You are right.
- 0ffh (14/21) Dec 16 2007 First I thought:
- Jarrett Billingsley (5/8) Dec 16 2007 Except that template value parameters have to be compile-time constants....
Is there any reason why the alias template parameter cannot be a literal? template Foo(alias b) { int X = b; } void main() { int y = 4; mixin Foo!(y); // This is okay mixin Foo!(4); // This fails to compile // "mixin Foo!(4) does not match any template declaration" } -- Derek Parnell Melbourne, Australia skype: derek.j.parnell
Dec 16 2007
Derek Parnell wrote:Is there any reason why the alias template parameter cannot be a literal? template Foo(alias b) { int X = b;What happens when "b=3;"?} void main() { int y = 4; mixin Foo!(y); // This is okay mixin Foo!(4); // This fails to compile // "mixin Foo!(4) does not match any template declaration" }regards, frank
Dec 16 2007
Derek Parnell pisze:Is there any reason why the alias template parameter cannot be a literal? template Foo(alias b) { int X = b; } void main() { int y = 4; mixin Foo!(y); // This is okay mixin Foo!(4); // This fails to compile // "mixin Foo!(4) does not match any template declaration" }IMHO should work... Bug? BR Marcin Kuszczak (aarti_pl)
Dec 16 2007
"Derek Parnell" <derek psych.ward> wrote in message news:jnak6l8ihhe1.k3tzm3in813z.dlg 40tude.net...Is there any reason why the alias template parameter cannot be a literal? template Foo(alias b) { int X = b; } void main() { int y = 4; mixin Foo!(y); // This is okay mixin Foo!(4); // This fails to compile // "mixin Foo!(4) does not match any template declaration" }This is correct. You can only alias things that have names; the number 3 does not have a name. What's weird is that: template Foo(alias b) { int X = b; } template Foo(int b) { int X = b; } void main() { int y = 4; mixin Foo!(4); // OK // mixin Foo!(y); // fails, matches multiple (???) } doesn't. Why does Foo!(y) match Foo(int)? A (kind of dumb) workaround is: template Foo(b...) { static assert(b.length == 1); int X = b[0]; }
Dec 16 2007
On Sun, 16 Dec 2007 15:51:38 -0500, Jarrett Billingsley wrote:"Derek Parnell" <derek psych.ward> wrote in message news:jnak6l8ihhe1.k3tzm3in813z.dlg 40tude.net...I know that is 'correct', but I was really asking what is the rationale behind such an apparently arbitrary design decision.Is there any reason why the alias template parameter cannot be a literal? template Foo(alias b) { int X = b; } void main() { int y = 4; mixin Foo!(y); // This is okay mixin Foo!(4); // This fails to compile // "mixin Foo!(4) does not match any template declaration" }This is correct. You can only alias things that have names; the number 3 does not have a name.What's weird is that: template Foo(alias b) { int X = b; } template Foo(int b) { int X = b; } void main() { int y = 4; mixin Foo!(4); // OK // mixin Foo!(y); // fails, matches multiple (???) } doesn't. Why does Foo!(y) match Foo(int)? A (kind of dumb) workaround is: template Foo(b...) { static assert(b.length == 1); int X = b[0]; }There are still a lot of things re templates that strike me as eccentric. -- Derek Parnell Melbourne, Australia skype: derek.j.parnell
Dec 16 2007
On Mon, 17 Dec 2007 03:07:22 +0100, 0ffh wrote:Derek Parnell wrote:Why? If you had such a template (one that used 'side effects') but supplied a literal, it would/should fail at the mixin site. I can't see why that necessarily prevents the same template being used with non-literals, as your example below demonstrates.On Sun, 16 Dec 2007 15:51:38 -0500, Jarrett Billingsley wrote:Well, for one we'd have to disallow assignment expressions using the aliased parameter (as well as pre- and post-increment)"Derek Parnell" <derek psych.ward> wrote in message news:jnak6l8ihhe1.k3tzm3in813z.dlg 40tude.net...I know that is 'correct', but I was really asking what is the rationale behind such an apparently arbitrary design decision.Is there any reason why the alias template parameter cannot be a literal? template Foo(alias b) { int X = b; } void main() { int y = 4; mixin Foo!(y); // This is okay mixin Foo!(4); // This fails to compile // "mixin Foo!(4) does not match any template declaration" }This is correct. You can only alias things that have names; the number 3 does not have a name.template Foo(alias b) { int X=(b=4); } void main() { int a=3; printf("%i\n",a); // 3 mixin Foo!(a); // side effect here printf("%i\n",a); // yeas, it's 4 now printf("%i\n",X); // 4mixin Foo!(5) // Should fail because 'int X=(5=4);' is bad syntax.}IMHO, such a template needs *heavy* justification as do all such 'hidden' side effects code. Buts that's just the way I think. -- Derek (skype: derek.j.parnell) Melbourne, Australia 17/12/2007 1:27:49 PM
Dec 16 2007
Derek Parnell wrote:Why? If you had such a template (one that used 'side effects') but supplied a literal, it would/should fail at the mixin site. I can't see why that necessarily prevents the same template being used with non-literals, as your example below demonstrates.You are right. I had the post retracted, but it seems you've seen it too quick! =)Yes, as it does for int instead alias, quite right there!template Foo(alias b) { int X=(b=4); } [...]mixin Foo!(5) // Should fail because 'int X=(5=4);' is bad syntax.IMHO, such a template needs *heavy* justification as do all such 'hidden' side effects code. Buts that's just the way I think.I agree, but as it is possible it would still have to be considered. regards, frank
Dec 16 2007
Derek Parnell wrote:On Sun, 16 Dec 2007 15:51:38 -0500, Jarrett Billingsley wrote:First I thought: "Well, for one we'd have to disallow assignment expressions using the aliased parameter (as well as pre/post-inc/decrement), which is bad for the goal of context insensitive scanning." But that's not it... same would go for "template Foo(int b)" where the error is caught later. Therefore I can only conjecture that it would add some complication to make some constant variable magically spring to life in order to replace the literal in the template code, and nobody has yet bothered Walter enough to do it.This is correct. You can only alias things that have names; the number 3 does not have a name.I know that is 'correct', but I was really asking what is the rationale behind such an apparently arbitrary design decision.JB: As y is declared as an int, I don't see why not... otherwise the template would only react to int literals but not int veriables, no? But I don't use templating that much, and so may overlook something. regards, frankWhy does Foo!(y) match Foo(int)?
Dec 16 2007
"0ffh" <frank frankhirsch.youknow.what.todo.net> wrote in message news:fk4nmj$7ad$1 digitalmars.com...JB: As y is declared as an int, I don't see why not... otherwise the template would only react to int literals but not int veriables, no? But I don't use templating that much, and so may overlook something.Except that template value parameters have to be compile-time constants.. unless the compiler's trying to be "smart" here, which I honestly did not expect.
Dec 16 2007