ImportC + metaprogramming?
Steven Schveighoffer
schveiguy at gmail.com
Sun Jan 16 02:28:04 UTC 2022
I was just watching Brian's talk on OpenBSD porting to D, and in the
comments on Youtube, someone asked about how ImportC might help with
avoiding having to port headers.
His response contained this truth nugget: "IIRC, importC goes directly
from C source to D AST, so importC would need to gain the ability to
rewrite its AST back into D source code."
One of the biggest problems with ImportC as everyone knows is the
preprocessor. One thing that absolutely sucks is if you have something like:
```c
#define foo 42
```
This information is lost forever once you preprocess the file. But you
can expose this by converting this to an enum! How to do it?
Well, this won't work:
```c
enum foo = foo; // translates to `enum 42 = 42`
```
So you have to come up with a *different* name, and then expose that.
This really sucks, and I believe projects like dstep translate the thing
to A D enum, and avoid using the preprocessor at all. But in the world
of C, there's not an easy way to do this without coming up with some
horrific naming mangle.
I thought, maybe if you import the C file, then you can introspect
something from D! But no, there is nothing left to introspect once the c
preprocessor is done. For actual functions, etc. that would work great,
but not #defines.
But Brian's statement got me thinking -- what if we allowed just a
*little bit* of the D camel's nose into the tent? Like some escape that
could allow the D compiler to actually inject some meta into the AST
while preprocessing?
What if we had something like a .cm or something file, which is treated
like C + metaprogramming (e.g. __traits)? Then we can use a specialized
preprocessor to be part of the compilation step that allows assisting
with the header "porting".
Is this crazy talk, or does it make any sense?
-Steve
More information about the Digitalmars-d
mailing list