On 2013-11-11 10:38, Rikki Cattermole wrote:

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.

My idea of handling errors in macros is more something like triggering a real compile error. That could be done via the context parameter, something like:

macro foo (Context context, Ast!(string) str)
{
    if (str.eval() == "bar")
context.error("Illegal value 'bar'"); // this will trigger the compile error
}

--
/Jacob Carlborg

Reply via email to