On Monday, 11 November 2013 at 09:24:31 UTC, Jacob Carlborg wrote:
On 2013-11-11 09:31, Rikki Cattermole wrote:

Theres a few other things I think would need to be cleared up.
For example take this code:

shader {
 program
 vertex {
  #version 150
  void main() {
  }
 }
 fragment {
  #version 150
  void main() {
  }
 }
}

At this point the vertex / fragment segments would be treated as strings instead of calling their macros. So perhaps a rule to identify macros inside macros calls? It would save a lot of time for parsing reasons.

They way I see that is the AST of the whole block would be passed to "shader". I have though a bit about macros inside macros, but I haven't come to a conclusion. The easiest way from a design point of view seems to be that "shader" to basically return the whole AST it receives plus any addition it needs to do. The the "vertex" and "fragment" macros are expanded recursively.

Also can you alias a macro?

alias fragment = tostring;

That would make things a lot simpler creating nice structures of them.

I don't see why not.

Perhaps a condition on a macro like the if's we got for templates would
be useful in the sense of being able to say:

if (lexer.compareLine(0, "[a-zA-Z]{1}[a-zA-Z_0-9]*") &&
lexer.isSymbol(1, SymbolTypes.Macro, vertex))

I don't think I understand how this should be used.

This would require us to develop a lexer library. But if done right I don't see why it wouldn't be usable for more than just D macro checks. Preferably also for e.g. c/c++ wink wink for when D's front end is in D.

An example of this might be:

macro foo (Context context, Ast!(string) str)
if (lexer.isSymbol(0, SymbolTypes.Class))
{
    return str;
}

class Bar {
 int i;
}

foo {
 Bar(7);
}
The above code would succeed however the below code will give a compiler error stating that the given macro is not found.

struct Haz {
 int i;
}

foo {
 Haz(9);
}

The above code is based on the assumption of a D lexer in phobos.
This is simpler set of code which won't require a lexer.

macro foo (Context context, Ast!(string) str)
if (str == "working")
{
    return "";
}

foo {fails}
foo {working}
In these cases its a simple string test to determine if the text given is specified value.

In the original example I gave, I was using regex to make the point of validation for a given line passed to the macro.

Reply via email to