reflection based on my experience so far on compile-time meta-programming in D as a novice user: the problems
feepingcreature at gmail.com
Mon Sep 14 08:01:47 UTC 2020
On Sunday, 13 September 2020 at 18:32:17 UTC, mw wrote:
> -- in D, there are too many choices, with no clear guideline
> which one is *THE* one to use for a particular purpose:
> language or library mechanisms? mixin? template? AliasSeq /
> aliasSeqOf? Tuple? (non-)?-eponymous version of ...?; and even
> for a particular option, e.g. Tuple!(int, "MA_optInTimePeriod",
> TA_MAType, "opInMAType"), there are choices to use either
> token (int) or string ("MA_optInTimePeriod"). And user does not
> have a strong guide on which choice is *THE* way to proceed.
> Each mechanism seems to have / fit a particular purpose, but
> when you start to use it, you'll probably find there are new
> problems come-in later, and you want to revisit the choice you
> made earlier on.
> By contrast, in C: there is only *ONE* mechanism, i.e. macro,
> that's it.
In Assembly, there is no choice between while and do/while and
for; there is only jmp. High-level structured expression is still
> -- in D, there is no easy way to convert between token <==>
> string. Given a token, does token.stringof always work to paste
> with other strings to generate a new token? and given a string,
> does mixin!"string" always work to be a valid token?
There is an easy way to convert between a token and a string:
"token". Seriously, stringof should be renamed to
stringof__debugOnlyReallyYouDontNeedThisForMetaprogrammingTrustMe. It's like catnip to C people. I don't know if the docs have a big fat warning saying "DO NOT USE THIS FOR METAPROGRAMMING EXCEPT FOR DEBUGGING AND ERROR MESSAGES, TRUST ME" but they probably should. Just use the name of the token metavariable!
> -- in D, there is no easy way to see directly the generated
> source code by the compiler at compile-time, which makes the
> debug difficult during development.
`pragma(msg, X.stringof)`. This is what stringof is for. I could
not imagine D metaprogramming without pragma(msg).
More information about the Digitalmars-d