On Mon, 12 Jul 2010 20:00:12 -0400, pillsy <pillsb...@gmail.com> wrote:

== Quote from Steven Schveighoffer (schvei...@yahoo.com)'s article:

On Mon, 12 Jul 2010 16:22:28 -0400, bearophile <bearophileh...@lycos.com>
wrote:
[...]
> In my opinion the std.bitmanip.bitfields souce code is already past the
> decency limit for string mixins, and I hope they will be replaced by
> something better.
How would AST macros make std.bitmanip.bitfields easier to understand? I
have never seen it before, and I understood it after a couple minutes
reading.  I bet the AST version would be actually harder to understand.

That's not such a great example. The problems will start piling up when you have more complicated arguments. Say you want your macro to look like it has an argument list with two entries, called like

     foo(x, y)

which acts like a string mixin, and receives "x, y" as the argument string. Then you split at the comma, and
you're fine.

This isn't exactly what I meant to do with macros. What I wanted was for the commas to separate the expressions, and pass those expressions via stringification. It isn't a fully fleshed out idea, but here is what I was thinking:

macro foo(arg1, arg2) mixin("$arg1 + $arg2;") // $ inside string references parameter, just a possibility

foo(x, y); // translates to mixin("x + y;");

These are just ideas, perhaps there are issues with them, but I think we can come up with reasonable rules that allow a lot of flexibility, and at the same time, allow mixins to be masked as normal expressions, resulting in greater usability in generic code, and much more beautiful code.

You go on with your day, and the next thing you know someone is complaining that your foo macro
doesn't work because it chokes on

    foo(bar(a, b), c)

and

    foo("d, e", f)

By the time you deal with all the possibilities, you'll have written most of a parser. That parser has gotta parse
the text into *something*, and it'll probably be a tree.

Or, you say "foo isn't meant to deal with that input" :)

I don't see people complaining that bitfields doesn't accept such various strings as arguments...

There's no reason you can't use library functions to parse strings containing D code into that tree; indeed, having access to such functions in the standard library would be useful in all sorts of ways. RIght now D is only a couple steps away from where it would need to be in order to allow people to build a really useful macro
system in libraries.

I think a full parser would not hurt, but most of the time, you just want to use the expressions in generating some code. Pulling apart an expression and reassmbling it can solve some problems, but the majority of the reason to need macros is to generate code, not to read it and rewrite it.

-Steve

Reply via email to