digitalmars.D - Alias templates and anonymous delegates in pipe/map
- Adrien Chauve (83/83) May 14 2011 Hi,
Hi, I've been playing with templates and I get some (really dumb) questions. By the way, I'm using dmd 2.053 64 bits on linux 64 bits. First, I didn't really get the difference between an alias template and a type template when they are both instanciated with a type. For example: //////// File test1.d // alias template template Foo(alias X) { alias X Y; } // type template template Foo2(X) { alias X Y; } struct Bar {} void main() { alias Foo!(Bar).Y BarAlias; // ok alias Foo2!(int).Y IntAlias; // ok alias Foo!(int).Y OtherIntAlias; // error } ////// end of file test1.d I get the following error from dmd: test1.d(19): Error: template instance Foo!(int) does not match template declaration Foo(alias X) test1.d(19): Error: identifier 'Y' of 'Foo!(int).Y' is not defined Why do the two templates behave differently? Why does the alias template yield an error? What did I miss about alias templates? My second question is about using anonymous delegates in map and pipe. I tried the following code: //////// File test2.d import std.functional; import std.algorithm; unittest { immutable auto x = [1, 2, 3, 4]; alias map!((i){return 2*i;}) mult2; assert(equal(mult2(x), [2,4,6,8])); alias pipe!(mult2) pipe_mult2; assert(equal(pipe_mult2(x), [2,4,6,8])); // ok alias pipe!(mult2, mult2) pipe_mult4; // error assert(equal(pipe_mult4(x), [4,8,12,16])); } void main(){} /////////// end of file test2.d and when compiling it with dmd -unittest test2.d I get: test2.d(368): Error: function test2.__unittest3.map!(__dgliteral1).map!(immutable(int[])).map is a nested function and cannot be accessed from doIt test2.d(368): Error: function test2.__unittest3.map!(__dgliteral1).map!(Result).map is a nested function and cannot be accessed from doIt So a single pipe!mult2 is ok but when a I put a second there's an error. What's also interesting is that all cases work fine when I use a named function instead of an anonymous delegate. I'm not sure to understand what's the error in compose (pipe uses compose). And the error returned by dmd is a bit strange because in no way test2.d has more than 20 lines (in fact line 368 is the first line of map in std/algorithm.d). Besides, without a template instanciation stack trace, I think it's a bit difficult to dive into template errors. Cheers, Adrien
May 14 2011