is this right??
Ary Borenszweig
ary at esperanto.org.ar
Wed Jun 17 03:42:48 PDT 2009
BCS escribió:
> Hello Ary,
>
>> BCS escribió:
>>
>>> Hello BCS,
>>>
>>>> void main()
>>>> {
>>>> int s;
>>>> mixin("s") = 5;
>>>> }
>>>> -----
>>>> Line 4: found '=' when expecting ';'
>>>> http://www.digitalmars.com/d/1.0/expression.html#MixinExpression
>>> (mixin("s")) = 5;
>>>
>>> Given that the above works, it looks like the parser prematurely
>>> commits to a mixin declaration when it finds "mixin (" at function
>>> scope.
>>>
>>> Unless someone spots a flaw in this, I'll post a bug.
>>>
>> Yes, at that point the parser is parsing statements, so if it finds a
>> "mixin(...)" it turns it into a statement.
>>
>
> http://d.puremagic.com/issues/show_bug.cgi?id=3073
>
> Hope you don't mind me quoting you.
Not at all!
But later when I went to sleep I thought about that a little more, and
look at this:
1. mixin("int x = 2;");
2. mixin("x = 2");
The first should be treated as a MixinStatement, because it ends with a
semicolon. The second should be treated as a MixinExpression, because it
doesn't end with a semicolon (and it's a perfectly valid expression,
it's an assign expression). But according to my patch it'll be treated
as a statement and it'll fail.
Now this:
3. mixin("int x = 2");
is neither of them.
You can only deduce that information if you can extract the contents of
the mixin, paste it in the source file and treat the whole line as a
statement, and you'd get things right. But now all of those lines can be:
mixin(secret());
and now you don't know, you'll have to wait for semantic anlaysis to
know that, but then it's too late.
But I think my patch is reasonable because it allows you to do more
things than before, it's backwards compatible and also you'd almost
never do number 2 but instead use number 1.
More information about the Digitalmars-d-learn
mailing list