digitalmars.D - Bragging about Unix and D
- Georg Wrede (24/24) Aug 23 2006 I just came to town. I had an interesting debate with somebody who
- BCS (2/32) Aug 23 2006 Crud, now I'm going to have to try that!
- Tom S (40/45) Aug 23 2006 Not hard at all...
- Sean Kelly (3/13) Aug 24 2006 Huh, now there's a use for mixin I can appreciate. Nice work.
- Oskar Linde (2/15) Aug 24 2006 but s/mixin/alias/ will work just as well. :)
- Sean Kelly (6/22) Aug 24 2006 True :-) Though this got me thinking again about iterative code
- Tom S (2/18) Aug 24 2006 Well, it's a typo, it was supposed to be an alias :D
- Bruno Medeiros (13/29) Aug 24 2006 Here it does, but in the general case it doesn't work as well. First
I just came to town. I had an interesting debate with somebody who didn't appreciate Unix (or Linux) or D enough. So I showed to him that interacting with a Unix machine is discussing, and that when you're good at it, you talk with sentences, not single commands (as in DOS). He demanded examples, and one I gave him was to ask the machine for a multiplication table. I conjured up the following sentence: $ for a in {0..9};do for b in {0..9};do echo -ne `dc -e"$a $b *pq"`"\011";done;echo;done which gave a nice table: 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 0 2 4 6 8 10 12 14 16 18 0 3 6 9 12 15 18 21 24 27 0 4 8 12 16 20 24 28 32 36 0 5 10 15 20 25 30 35 40 45 0 6 12 18 24 30 36 42 48 54 0 7 14 21 28 35 42 49 56 63 0 8 16 24 32 40 48 56 64 72 0 9 18 27 36 45 54 63 72 81 Now, I wanted to do the same thing with DMD, but I failed miserably. What I tried to do was some kind of template magic (a la Don) that prints something like this at compile time, without even creating an executable. -- Sigh, can't win 'em all.
Aug 23 2006
Georg Wrede wrote:I just came to town. I had an interesting debate with somebody who didn't appreciate Unix (or Linux) or D enough. So I showed to him that interacting with a Unix machine is discussing, and that when you're good at it, you talk with sentences, not single commands (as in DOS). He demanded examples, and one I gave him was to ask the machine for a multiplication table. I conjured up the following sentence: $ for a in {0..9};do for b in {0..9};do echo -ne `dc -e"$a $b *pq"`"\011";done;echo;done which gave a nice table: 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 0 2 4 6 8 10 12 14 16 18 0 3 6 9 12 15 18 21 24 27 0 4 8 12 16 20 24 28 32 36 0 5 10 15 20 25 30 35 40 45 0 6 12 18 24 30 36 42 48 54 0 7 14 21 28 35 42 49 56 63 0 8 16 24 32 40 48 56 64 72 0 9 18 27 36 45 54 63 72 81 Now, I wanted to do the same thing with DMD, but I failed miserably. What I tried to do was some kind of template magic (a la Don) that prints something like this at compile time, without even creating an executable. -- Sigh, can't win 'em all.Crud, now I'm going to have to try that!
Aug 23 2006
Georg Wrede wrote:What I tried to do was some kind of template magic (a la Don) that prints something like this at compile time, without even creating an executable. -- Sigh, can't win 'em all.Not hard at all... const int numWidth = 6; const int width = 10; const int height = 10; template itoa(int i) { static if (i < 10) { const char[] itoa = "" ~ "0123456789"[i]; } else { const char[] itoa = itoa!(i/10) ~ "0123456789"[i%10]; } } template nspaces(int n) { static if (n > 0) { const char[] nspaces = " " ~ nspaces!(n - 1); } else { const char[] nspaces = ""; } } template itoa_pad(int i) { const char[] itoa_pad = itoa!(i) ~ nspaces!(numWidth - itoa!(i).length); } template row(int hpos, int i = 0) { static if (i+1 < width) { const char[] row = itoa_pad!(i*hpos) ~ row!(hpos, i+1); } else { const char[] row = itoa_pad!(i*hpos); } } template table(int i = 0) { pragma (msg, row!(i)); static if (i+1 < height) { mixin .table!(i+1) table; } else { alias void table; } } alias table!() draw; -- Tomasz Stachowiak
Aug 23 2006
Tom S wrote:template table(int i = 0) { pragma (msg, row!(i)); static if (i+1 < height) { mixin .table!(i+1) table; } else { alias void table; } }Huh, now there's a use for mixin I can appreciate. Nice work. Sean
Aug 24 2006
Sean Kelly wrote:Tom S wrote:but s/mixin/alias/ will work just as well. :)template table(int i = 0) { pragma (msg, row!(i)); static if (i+1 < height) { mixin .table!(i+1) table; } else { alias void table; } }Huh, now there's a use for mixin I can appreciate. Nice work.
Aug 24 2006
Oskar Linde wrote:Sean Kelly wrote:True :-) Though this got me thinking again about iterative code generation in D--I've been too occupied with other things to get fancy with template programming recently. Working arount ITI limitations is about the extent of it. SeanTom S wrote:but s/mixin/alias/ will work just as well. :)template table(int i = 0) { pragma (msg, row!(i)); static if (i+1 < height) { mixin .table!(i+1) table; } else { alias void table; } }Huh, now there's a use for mixin I can appreciate. Nice work.
Aug 24 2006
Oskar Linde wrote:Sean Kelly wrote:Well, it's a typo, it was supposed to be an alias :DTom S wrote:but s/mixin/alias/ will work just as well. :)template table(int i = 0) { pragma (msg, row!(i)); static if (i+1 < height) { mixin .table!(i+1) table; } else { alias void table; } }Huh, now there's a use for mixin I can appreciate. Nice work.
Aug 24 2006
Oskar Linde wrote:Sean Kelly wrote:Here it does, but in the general case it doesn't work as well. First since the mixin creates a (unique) new template instance, that might differ significantly if such template has run-time members. Second, you can't use a mixin in an instruction block, and an alias can (and I've used that). So that's not a good use for mixin, use alias for instantiating dummy template instances. :) Also the ... else { alias void table; } is not necessary. ;)Tom S wrote:but s/mixin/alias/ will work just as well. :)template table(int i = 0) { pragma (msg, row!(i)); static if (i+1 < height) { mixin .table!(i+1) table; } else { alias void table; } }Huh, now there's a use for mixin I can appreciate. Nice work.
Aug 24 2006