If we could start from scratch and guarantee that no new attributes would ever be introduced, then we could just put @ on none of them and thus be fully consistent. But we can't start from scratch, and we can't guarantee that there will be no new attributes. And even then, instead of getting complaints about being inconsistent with @, then we'd get even more
complaints about the number of keywords that we have.

There is no way to win here. No matter what we do, there will be screaming from someone. And whether the language would be objectively improved would
be debatable.

I have proposed a way that I think is a win win. Add support for non-keyword function attributes on the right hand side of a function signature. This will not break any code since it does not require removing support for using '@' for function attributes. Then later we can deprecate support for the '@' character if we feel like it's worth breaking code.

void foo() safe; // now valid, and safe is not a keyword
safe void foo(); // still not valid, might make the grammar
                 // ambiguous, if it does not then it could
                 // be supported later
void foo() @safe; // Still ok (can be deprecated)

It's simple to remember that if you put the function attribute on the right hand side then no '@' is required. Plus, this will encourage developers to put their attributes on the right hand side in the future so they can remove the '@' character.

PLUS, this would be very simple to implement!

There may be set of changes that would ultimately be better enough that they'd be worth making - where the pros are generally considered to outweigh the cons - but we'll be stuck with the cons regardless, and I seriously question that any change to attribute names is enough of an improvement to merit the code breakage that it would cause, even if it were objectively
better.

My proposal will not break any code.

Reply via email to