Metaprogramming without templates

Stefan Koch uplink.coder at googlemail.com
Sun Jun 20 22:51:06 UTC 2021


Good Evening,

As you know from my previous typefunction project I am trying to 
make CTFE more usable for proper metaprogramming (as opposed to 
just string manipulation and string mixins).
Since I do believe that working with structure and rich 
data-types is more useful than working with only strings 
essentially.

The goal is to be able to write regular procedural code, to 
introspect existing or generate new code.

This I want to achieve with core.reflect and core.codegen, which 
will be part of druntime and give access to compiler/CTFE 
integrated reflection capabilities.

in core.reflect.decl, for example you would see:
```
import core.reflect.node; // Empty base class is defined in there
enum DeclarationKind
{
     FunctionDeclatation,
     /+
     StructDeclaration,
     UnionDeclarartion,
     ClassDeclarartion,
     VariableDeclaration,
     AliasDeclaration,
     TemplateDeclaration,
     +/
}
class Declaration : Node
{
     string name;
     DeclarationKind kind;
     Attribute[] attributes;
     Linkage linkage;
     string comment;
}

Declaration[] DeclarationsFromString(string s);
```

Which can then be used like so:
```
pragma(msg, DeclarationsFromString(
  q{
   int var = 3;
   void* myFunc (void*) {};
  }
)[1].name);
```
and it would output the name if the second Declarartion which is:
"myFunc"

this functionality does already work as of a few hours ago.
However it runs into forward reference issues even more than type 
functions did.
And I assume I'll first have to make advances on dealing with 
complicated forward reference graphs before I can show anything 
neat.



More information about the Digitalmars-d mailing list