On Thursday, 21 January 2016 at 23:05:51 UTC, Dibyendu Majumdar wrote:
I am puzzled as to why there is @nogc on the one hand and simply nothrow on the other? Why are some attributes prefixed with '@' while others aren't?

Regards

Short answer: It's for historical reasons; it would not be done this way today, but cannot be changed without breaking valid code already in the wild.

Longer answer: The ones prefixed with @ are not keywords. This is good, because it means that they are not reserved, and may be used as identifiers as well.

This will compile fine:

void nogc(int nogc) @nogc nothrow {
}

This won't, though:

void nothrow(int nothrow) @nogc nothrow {
}

When the process of designing D began, people didn't realize just how many attributes would end up being added to the language. At some point, it became clear that it was both undesirable and unnecessary to forbid all attribute names from being used for other purposes elsewhere in D's grammar. The solution was to begin prefixing @ to new attributes.

Adding the @ to the old attributes was discussed as well, but it didn't seem worth the code breakage.

A revision of D that wasn't constrained by backwards compatibility would almost certainly either require all attributes to be prefixed by @, or change the grammar such that attribute names could be reused as identifier names without introducing ambiguities.

Reply via email to