Another thing that was not mentioned in this thread (sorry, I should of done so in my first post), is that it has some of the best compile time introspection around for a C style language. Pair that with actually good compile time function execution and its actually nice to use templates and your able to pull of a lot.
Look how easy it is for me for example to get a list of functions defined in a C file and then filter them.
#if __IMPORTC__
__module stuff.foo;
#endif
void foobar(void){}
void _bad_foobar(void){}
#!/usr/bin/env -S rdmd -g -i -I=..
module stuff.test;
void main() {
import std.stdio : writeln;
import std.algorithm : filter;
import std.array : array;
import stuff.foo;
enum string[] module_member_names = [__traits(allMembers, stuff.foo)].filter!(v => v[0] != '_').array;
writeln("hello ", module_member_names); // hello ["foobar"]
}
Take a look at features like https://dlang.org/spec/traits.html and https://dlang.org/articles/mixin.html
Lesser languages require horrible build scripts with several steps where you compile source code generators to work around the inability to introspect and to generate at compile time.