On Thursday, 30 January 2014 at 14:08:27 UTC, Ilya Yaroshenko
wrote:
1) You can use
mixin(format("<Prolog>%(<Begin>%s<End>%)<Epilog>",
CompileTimeRange)); See std.format for ranges and
std.string.format.
That works for simple cases. Complex cases require that you write
a function and calling it with CTFE for creating the mixin
string. This can be a problem outside functions, because you are
polluting the namespace. It might not be that bad for structs and
classes, since you can simply make that helper function private -
but for template mixins the helper function must be exposed to
the code that uses the mixin.
Having complex strings mixing also means that if there is a
problem in that string, the compiler will point to the line where
the string is mixed in, not the one where the code that
introduces the error is concentrated to the string. Having a
static foreach will make the string mixins small and simple
enough for this to not be a problem.
Metaprogramming by building the code strings is not something
that should be encouraged(*cough* C macros *cough*), but it's
currently required sometimes for complex metaprogramming in D. If
we had static foreach we would still need string mixins, but at
least we will be mixing in many small simple strings instead of
one big complex string, and that means we could add to Phobos
some helper template mixins for sanitizing the arguments for
those mixins.