DIP 50 - AST macros
Jacob Carlborg
doob at me.com
Mon Nov 11 05:07:51 PST 2013
On 2013-11-11 12:34, Dmitry Olshansky wrote:
> I have to say I like it.
Cool :)
> I find it nice that it would allow one to finally ensure that inlining
> is always done by making critical primitives macros instead of
> functions. This is vastly superior compared to the _only_ current option
> of generating unrolled code with string mixins.
>
> I'd call attribute macros - declaration macros in line with statement
> macros, then describe how they look - a lot like attributes.
Ok, I can change that.
> Things to note though:
> - Can't implement scope(exit/success/failure) because that would need
> to capture the outer scope to pack it into try/catch/finally.
Right. scope(exit) could perhaps be implement with a custom struct and
calling a block in the destructor.
> - Can't implement foreach if only because of the syntax of the latter.
I would think something like this:
macro foreach (T) (Context context, Ast!(Symbol) var, Ast!(T)
collection, Statement block)
{
if (isRange(collection))
{
return <[
for (auto __r = $collection; !__r.empty; __r.popFront())
{
auto $var = __r.front;
block;
}
]>;
}
else if (hasOpApply(collection))
{
...
}
else ...
}
Perhaps not all of the existing syntax can fit in a macro.
> - There is no definition of Ast!(T) construct - I take it's a struct
> or a class of sorts and the whole thing works with the CTFE engine. Then
> it also needs specification of Statements, Declarations.
Yes, something like that. I don't know exactly how the Ast type need to
look like. See one of my replies to bearophile:
http://forum.dlang.org/thread/l5otb1$1dhi$1@digitalmars.com
> - It seems like I can use AST literal in R-T code as well? That would
> be useful but only if some library actually accepted these AST nodes.
Actually, I haven't thought about this. I think my original idea was
that <[ ]> should only work inside macros. But that it would be possible
to pass Ast nodes to other functions.
--
/Jacob Carlborg
More information about the Digitalmars-d
mailing list