DIP 1003 Formal Review

MysticZach via Digitalmars-d digitalmars-d at puremagic.com
Thu May 25 11:57:47 PDT 2017


On Thursday, 25 May 2017 at 11:49:47 UTC, MysticZach wrote:
> ...there is no known possibility of semantic confusion between 
> the two potential uses of `body`,

I spoke too soon. I found a place where such semantic ambiguity 
is possible. It can only occur in interface declarations, and 
will not exist in any currently compilable D code, as it requires 
`body` to be an identifier to be legal in the first place.

Currently, the only place in D where you can declare a function 
that has a contract, but no body, is in an interface. D syntax, 
it turns out, does not require a semicolon at the end of such 
declarations. Referencing 
https://dlang.org/spec/interface.html#interface-contracts we have:

interface I
{
     int foo(int i)
     in { assert(i); } // <-- no semicolon required

     void bar();
}

Therefore, with `body` as an identifier, you might have this 
ambiguity:

struct body {}

interface I {
   int foo(int i)
   in { assert(i); }

   body bar();
}

The ambiguity is fixable by modifying the parser to look ahead 
after `body` for `{`. Since virtual interface functions are not 
even allowed to have bodies, if it finds `{`, then `body` should 
be interpreted as a keyword, and an error issued. In all other 
cases `body` should be interpreted as an identifier.

This is not a hard problem, but it is indeed a semantic 
ambiguity, so it bears mentioning.


More information about the Digitalmars-d mailing list