mixin functions
Chris Nicholson-Sauls
ibisbasenji at gmail.com
Thu Nov 1 16:58:47 PDT 2012
On Thursday, 1 November 2012 at 15:59:04 UTC, Gor Gyolchanyan
wrote:
> OR, better yet:
>
> mixin MyMixin
> {
> foreach(i; 0..10)
> MyMixin ~= "writeln(" ~ to!string(i); ~ ");\n"'
> }
>
> And this could be printed out as a pragma(msg, ...) or into a
> .log file or
> anywhere else. This way it's easy to see what did end up being
> mixed in.
>
>
Given that template mixins are currently declared as (mixin
template Foo () {...}), would it make even more sense to extend
this out to a more literal interpretation of the subject line
("mixin functions")? I'm thinking something like this:
mixin string myMixin () {
string res;
foreach ( i ; 0 .. 10 )
res ~= "writeln(" ~ to!string( i ) ~ ");\n";
return res;
}
And later using it as:
mixin myMixin();
The same as templates. The caveat is that the compiler treats
'myMixin' as though it were a template containing only the
function, so it is evaluated in the context of where it is mixed
in. Since it makes little sense to return anything other than a
string, perhaps the absence of the 'template' keyword would imply
a function with 'string' return type.
mixin myMixin () {
// ...same...
}
The mixin *expression*, of course, would be unaffected. Maybe it
would be of limited benefit to the OP, but it might be generally
useful. Otherwise, while ugly, the current anonymous delegate
approach isn't the most horrid thing imaginable.
-- Chris Nicholson-Sauls
More information about the Digitalmars-d
mailing list