On 12/31/2011 12:02 AM, Andrei Alexandrescu wrote:
On 12/30/11 3:51 PM, Timon Gehr wrote:
On 12/30/2011 09:51 PM, Andrei Alexandrescu wrote:
On 12/30/11 12:10 PM, Walter Bright wrote:
On 12/30/2011 4:05 AM, Timon Gehr wrote:
It certainly does. That is how all my code generation looks like. The
fact that
I am using string mixins to solve some problems shows that those are
not
'problems in D string mixins'.

I your solution to parameterized strings is very nice. Can you write a
brief article about it? This should be more widely known.

The idea is good, but nonhygienic: the macro's expansion picks up
symbols from the expansion context.


What the template 'X' currently achieves is an improvement in syntax:

string generated = "foo!\""~x~"\"(\""~bar(y)~"\")";

vs

string generated = mixin(X!q{
foo!"@(x)"("@(bar(y))")
});

I understand that. But the whole system must be redesigned. Quoting from
my email (please let's continue here so as to avoid duplication):

The macro facility should be very simple: any compile-time string can be
a macro "body".

The key is the expansion facility, which replaces parameter placeholders
(e.g. in the simplest instance $1, $2 etc) with actual parameters. This
is missing. Also, there must be expansion of other already-defined macro
names. This is already present.

The library has a simple interface:

enum myMacro = q{... $1 $2 $(anotherMacro($1))... };

// To mixin
mixin(expand(myMacro, "argument one", "argument two"));


Andrei



I understand, but compared to how I solved the issue

1. it invents an (arguably inferior) parameter passing system, even though there is one in the language. 2. it picks up all symbols used in $(...) from the caller's context rather than the callee's context and there is no way to get rid of that default, because the macro is unscoped.











Reply via email to