digitalmars.D.learn - Sorry, I just love templates, AAs and mixins :)
- "Saaa" <empty needmail.com> Oct 16 2009
- Ary Borenszweig <ary esperanto.org.ar> Oct 17 2009
- "Saaa" <empty needmail.com> Oct 18 2009
- Chris Nicholson-Sauls <ibisbasenji gmail.com> Oct 18 2009
- "Saaa" <empty needmail.com> Oct 19 2009
- grauzone <none example.net> Oct 17 2009
- Ellery Newcomer <ellery-newcomer utulsa.edu> Oct 17 2009
- "Saaa" <empty needmail.com> Oct 18 2009
public void addToAA(char[] var_name, KT, ET)(KT key, ET element)
{
mixin(ET.stringof~`[]* elements = key in `~var_name~`;`);
if( elements == null )
{
ET[] temp;
temp.length = 1;
temp[0] = element;
mixin(var_name~`[key] = temp;`);
}
else
{
(*elements).length = (*elements).length + 1;
(*elements)[(*elements).length-1] = element;
}
}
Oct 16 2009
Saaa wrote:public void addToAA(char[] var_name, KT, ET)(KT key, ET element) { mixin(ET.stringof~`[]* elements = key in `~var_name~`;`); if( elements == null ) { ET[] temp; temp.length = 1; temp[0] = element; mixin(var_name~`[key] = temp;`);
Why `key`? Where's `key` defined?} else { (*elements).length = (*elements).length + 1; (*elements)[(*elements).length-1] = element;
I don't understand this. Key is not used.} }
And how do you use it? I tried to but I failed. Also passing a string as var_name is not nice. Isn't it better to write something like: char[int] x; x.add(1, 'h'); ?
Oct 17 2009
Ary Borenszweig wrote:Saaa wrote:public void addToAA(char[] var_name, KT, ET)(KT key, ET element) { mixin(ET.stringof~`[]* elements = key in `~var_name~`;`); if( elements == null ) { ET[] temp; temp.length = 1; temp[0] = element; mixin(var_name~`[key] = temp;`);
Why `key`? Where's `key` defined?
} else { (*elements).length = (*elements).length + 1; (*elements)[(*elements).length-1] = element;
I don't understand this. Key is not used.
} }
And how do you use it? I tried to but I failed.
BaseType[][KeyType] AAname; addToAA!("AAname")(KeyType key, BaseType value);Also passing a string as var_name is not nice. Isn't it better to write something like: char[int] x; x.add(1, 'h'); ?
The string is the actual variable name so I think that way doesn't work, right? Check the new version(shorter) in my other reply :D
Oct 18 2009
Saaa wrote:Ary Borenszweig wrote:Saaa wrote:public void addToAA(char[] var_name, KT, ET)(KT key, ET element) { mixin(ET.stringof~`[]* elements = key in `~var_name~`;`); if( elements == null ) { ET[] temp; temp.length = 1; temp[0] = element; mixin(var_name~`[key] = temp;`);
} else { (*elements).length = (*elements).length + 1; (*elements)[(*elements).length-1] = element;
} }
BaseType[][KeyType] AAname; addToAA!("AAname")(KeyType key, BaseType value);Also passing a string as var_name is not nice. Isn't it better to write something like: char[int] x; x.add(1, 'h'); ?
The string is the actual variable name so I think that way doesn't work, right? Check the new version(shorter) in my other reply :D
This worked just now with DMD 2.035: ////////////////////////////// BEGIN CODE module test1; import std .stdio ; public void add ( AAA : E[][K], K, E ) ( ref AAA aa, K key, E[] elem ... ) { if ( auto ptr = key in aa ) { *ptr ~= elem; } else { aa[ key ] = elem; } } void main () { int[][ char ] sandbox ; sandbox.add( 'a', 1 ); sandbox.add( 'b', 1, 2 ); sandbox.add( 'c', 1 ); sandbox.add( 'a', 2, 3 ); foreach ( key, elems ; sandbox ) { writeln(` [`, key, `] `, elems); } } ////////////////////////////// END CODE -- Chris Nicholson-Sauls
Oct 18 2009
Chris Nicholson-Sauls wrote:Saaa wrote:Ary Borenszweig wrote:Saaa wrote:public void addToAA(char[] var_name, KT, ET)(KT key, ET element) { mixin(ET.stringof~`[]* elements = key in `~var_name~`;`); if( elements == null ) { ET[] temp; temp.length = 1; temp[0] = element; mixin(var_name~`[key] = temp;`);
} else { (*elements).length = (*elements).length + 1; (*elements)[(*elements).length-1] = element;
} }
BaseType[][KeyType] AAname; addToAA!("AAname")(KeyType key, BaseType value);Also passing a string as var_name is not nice. Isn't it better to write something like: char[int] x; x.add(1, 'h'); ?
The string is the actual variable name so I think that way doesn't work, right? Check the new version(shorter) in my other reply :D
This worked just now with DMD 2.035: ////////////////////////////// BEGIN CODE module test1; import std .stdio ; public void add ( AAA : E[][K], K, E ) ( ref AAA aa, K key, E[] elem ... ) { if ( auto ptr = key in aa ) { *ptr ~= elem; } else { aa[ key ] = elem; } } void main () { int[][ char ] sandbox ; sandbox.add( 'a', 1 ); sandbox.add( 'b', 1, 2 ); sandbox.add( 'c', 1 ); sandbox.add( 'a', 2, 3 ); foreach ( key, elems ; sandbox ) { writeln(` [`, key, `] `, elems); } } ////////////////////////////// END CODE -- Chris Nicholson-Sauls
Thanks, that looks nice. One small difference is that main() now needs to have access to sandbox whereas using mixins you could keep sandbox private to add()'s location.
Oct 19 2009
Saaa wrote:public void addToAA(char[] var_name, KT, ET)(KT key, ET element) { mixin(ET.stringof~`[]* elements = key in `~var_name~`;`); if( elements == null ) { ET[] temp; temp.length = 1; temp[0] = element; mixin(var_name~`[key] = temp;`); } else { (*elements).length = (*elements).length + 1; (*elements)[(*elements).length-1] = element; } }
It's unreadable. What the hell does it do? How do you use it? It's a good example how you can write-only code in D.
Oct 17 2009
grauzone wrote:Saaa wrote:public void addToAA(char[] var_name, KT, ET)(KT key, ET element) { mixin(ET.stringof~`[]* elements = key in `~var_name~`;`); if( elements == null ) { ET[] temp; temp.length = 1; temp[0] = element; mixin(var_name~`[key] = temp;`); } else { (*elements).length = (*elements).length + 1; (*elements)[(*elements).length-1] = element; } }
It's unreadable.
No it isn't. It's an obfusticated version of if( key in var) var[key] ~= element; else var[key] = [element]; but who wants to write that boring code? :)
Oct 17 2009
Ellery Newcomer wrote:grauzone wrote:Saaa wrote:public void addToAA(char[] var_name, KT, ET)(KT key, ET element) { mixin(ET.stringof~`[]* elements = key in `~var_name~`;`); if( elements == null ) { ET[] temp; temp.length = 1; temp[0] = element; mixin(var_name~`[key] = temp;`); } else { (*elements).length = (*elements).length + 1; (*elements)[(*elements).length-1] = element; } }
It's unreadable.
No it isn't. It's an obfusticated version of if( key in var) var[key] ~= element; else var[key] = [element];
No, it isn't. It's obfusticated version of the generic version of that code :) I always forget ~= and somehow [] with a single variable in it looks strange, my bad! So, thanks! This is why I posted it in the first place; could you maybe look over DData as well :) I somehow like that I can tell the compiler precisely(mixins) how to generate generic(templates) code..but who wants to write that boring code? :)
:P Here is the new and improved version : public void addToAAA(char[] var_name, KT, ET)(KT key, ET element) { mixin(ET.stringof~`[]* elements = key in `~var_name~`;`); if( elements == null ) { mixin(var_name~`[key] = [element];`); } else { (*elements) ~= element; } }
Oct 18 2009









"Saaa" <empty needmail.com> 