AST macros

Walter Bright newshound at digitalmars.com
Tue Mar 20 11:20:02 PDT 2007


Don Clugston wrote:
> Walter Bright wrote:
>> Don Clugston wrote:
>>> Walter Bright wrote:
>>>> You'll be able to do things like:
>>>>  >>
>>>>  >> macro print(arg)
>>>>  >> {
>>>>  >> writefln(__FILE__, __LINE__, arg);
>>>>  >> }
>>>
>>> This looks great already. However, I don't see any specific "abstract 
>>> syntax tree" syntax in this. Is that still a work-in-progress?
>>
>> The beauty of it is that (a+b), before semantic analysis, is an AST! 
>> So there's no funky new grammar to learn.
> 
> Fantastic! Does this mean that you just use arg.stringof to get the 
> expression? And 'arg' to evaluate it?

I'm not totally sure yet.

> 
>>> An observation:
>>> My version of vector operation expression templates is mostly working 
>>> now, using the existing mixins. It deals with ASTs by constructing a 
>>> string representing the operations to be performed, and a tuple 
>>> containing all of the parameters. The operations string is of the form
>>> "g+=((a+b)*c)+((d*e)+f)", where a, b, c... correspond to T[0], T[1], 
>>> T[2]... of the tuple T.
>>>
>>> A compile-time function converts the string into postfix, and then 
>>> another CFTE function converts that into optimised x87 asm, which is 
>>> mixed in.
>>
>> Wow! I think the macros can help by obviating the need for the user to 
>> do the mixin manually.
> 
> Actually usage is OK already. Here's an example:
> ------
>     auto p = Vec([1.0, 2, 18]);
>     auto q = Vec([3.5L, 1.1, 3.8]);
>     auto r = Vec([17.0f, 28.1, 1]);
>     q -= ((p+r)*18.0L*314.1L - (p-r))* 35;
>     real d = dot(r, p + 3.7*r);
> ------
> And the only reason for Vec() is because otherwise you can't create 
> array operations. In the first stage, the Vector structs returned by 
> Vec() are removed, and only built-in real[], double[], and float[] 
> vectors are put into the tuple.
> BTW the generated asm is really good quality; in each case, it generates 
> the best code I can write by hand.
> 
>>> Unexpectedly, I found that it's actually very nice to have flattened 
>>> tuples. If an AST could recognise that two parameters are the same, 
>>> it could avoid duplication in the tuple, something that a tree can't 
>>> easily do:
>>> eg   somevec+= othervec + somevec*3;
>>> could become "T[1]+=T[0]+(T[1]*3)" which allows better code 
>>> generation in the final stage.
>>
>> There's a way to do this using specialization:
>>
>>     macro foo(somevec : somevec+=othervec+somevec, othervec)
>>
>> which will only match for parameters of the form:
>>
>>     foo( a += b + a);
>>
>>     somevec => a
>>     othervec => b
>>
>> It works analogously to how you can match type patterns in templates 
>> using specializations.
> 
> Now that could be useful...
> Are we going to able to write macros for member functions, and operator 
> overloads?

Probably not.



More information about the Digitalmars-d mailing list