Metaprogramming with D

FunkyD MrFunky at YourDaddy.com
Sun Jun 7 00:03:02 UTC 2020


On Saturday, 6 June 2020 at 09:57:36 UTC, Jan Hönig wrote:
> We have two (little) student projects, which should use D for 
> meta-programming/code generation.
>
> More specifically string mixins and templates.
>
> I understand (at least I think so :)) string mixins. The task 
> is to create a small internal DSL, which is capable of printing 
> out D code, which we then will use as a mixin. So basically 
> using CTFE to create code at compile time. (any additional 
> sources/ideas are welcome).
>
> The second project considers templates.
> My idea was to recreate some template expressions, like we all 
> know and love (hate) in C++.
> However I am not so sure if that is a really good idea.
> As far as I understood it, that is basically what ranges in D 
> do.
> So this would just mean "code linear algebra with ranges", 
> which I am sure plenty of D's libraries do already (mir?). 
> (that doesn't mean, it is not a good learning experience for 
> the student).
>
>
> I would love to hear some opinions on that matter.


D is pretty good for meta-programming. For certain other things 
it is terrible. One of the key features of D is it's meta 
programming.

String mixins simply mix in D code. It lets you build generic D 
code. The big problem here is debugging. There is ZERO ability to 
properly debug string mixins. Well, what it boils down to is 
writing out the string mixin and then debugging that. Visual D 
does have the ability to open up the output and one can try to 
compile such things but it can be a pain for complex cases.

It would be nice if D had a special D code string that the IDE 
could interpret properly.

Templates are just templates, just generic code. D is far better 
than C++ and most other languages. Template are more than ranges. 
Ranges use templates.

Templated code simply means generic code. E.g., rather than 
working with specific integers you work with integer variables.

Generally the type of the variable is undefined it constrained 
but otherwise unknown.

R foo(T)(T a)

R and T are types. We can call foo with any type, it no longer 
requires overloading and all that. But if the code in foo depends 
on specific types then it must be dealt with using various means 
to constrain the type.

D basically tries to resolve things after the fact so

R add(T)(T a, T b)
{
     return a + b;
}

this will attempt to + on a and b after the types are known. If 
they can't be added then an error will occur, which is usually 
cryptic for templates. When using templates one generally also 
cannot debug them as easy. One might get a long error message for 
simple issues. R above is deduced from type of a + b, which 
probably would be a T.

So such a simple templated function, or generic function can be 
used to add doubles, ints, floats, etc... anything with + 
operator.

Further more there are more tools available such as passing 
compile time parameters and such.


One can do quite a lot with D's string mixins and templates but 
the biggest issue is error messages and debugging. Sometimes 
things are not so easy to do with templates or require strange 
workarounds, but otherwise probably 98% of all things can be done.

When one is working with generic types one has to learn more 
machinery such as `is`, traits, etc.

The issue in using D should not be made based on it's 
metaprogramming. It will be a mistake! Now, if the only goal is 
to use D for it's metaprogramming then it is an excellent 
choice... although there are other languages starting to compete 
with D and functional languages probably offer better overall 
cohesiveness if you want to go down the functional 
route(ultimately there is little difference but the syntax and 
some of the semantics seem vastly different).

D, IMO, is not capable of writing sophisticated programs... this 
is why you do not see any. No one writes large commercial apps in 
D. There is not one! The D ecosystems is poorly structured 
compared to the top contenders. D is good for small apps, 
utilities, etc. D can be integrated with other apps though but 
then one loses some of the meta capabilities(since they won't 
translate).










More information about the Digitalmars-d-learn mailing list