On Friday, 28 July 2017 at 01:50:24 UTC, Jonathan M Davis wrote:
On Friday, July 28, 2017 01:13:10 Nicholas Wilson via
Digitalmars-d wrote:
IIRC the reason they lack a leading @ is purely historical and
considered not good but not worth breaking code over. I
believe this DIP presents an opportunity and reason to make
that change. Existing code will still work i.e. we can
deprecate the old form, since both the new and the old are
implementation controlled, and make it become a positional
keyword or the like.
The only reason that _any_ of them have @ on them was to avoid
creating a new keyword. And I for one would hate to see @ on
all of them.
Fair enough, but its always slightly annoyed me that `pure` and
`nothrow` don't have leading '@'s.
It's just trading on inconsistency for another. Should public
have @ on it? Should static have @ on it? What about scope,
const, or shared? You're just taking a subset of the attributes
and turning them into enums with @ on them and leaving some of
them as-is.
This DIP is in the process of being amended to explicitly exclude
linkage, storage class & visibility attributes. That Subset are
function attributes under the 'Encompassed' and 'Optionally
encompassed' subsections of "Attributes & attribute-like compiler
behaviour encompassed in this DIP".
How is that making things more
consistent? It's just shuffling the attributes around and for
some reason turns some of them into enums while leaving others
as they are.
Its turning keyword-like compiler magic attributes into regular
compiler attributes.
IMHO, doing anything to change the current attributes had
better have an _extremely_ good reason, and this DIP does not
give that. Yes, being able to negate attributes would be
valuable, but that really doesn't seem to be what this DIP is
about much as that's what it gives as a rationale. Instead, it
seems to be talking about altering attributes in a manner which
makes them way more complicated than they are now.
I also _really_ don't like the idea of having aliases for
built-in attributes.
That is a feature.
If we had that, instead of looking at a function and seeing
@safe, pure, nothrow, etc., we could end up seing something
like @VibeDefault, and then you'd have to go figure out what on
earth that was, and even after you figured out what it was, it
could change later. At least with what we have now, I can know
what I'm looking at.
I dont mean to be snide but either
1) ignore them, i see AliasSeq of attributes more useful for end
users, i.e. application developers, or
2) use an IDE.
In addition, it looks like the DIP is talking about what the
default attributes in general are. It's one thing to slap a
default set of attributes at the top of a module and then
negate them later in the module (which we can already do with
attributes like public or @safe but can't do with some of the
others like pure or nothrow). It's a different thing entirely
to basically change the default attributes via a compiler
switch. That's just dividing the language. You end up with code
that works with one set of compiler switches but not another
and is thus incompatible with other code - because of a
compiler switch. Walter has been against such compiler flags
every time that they've come up, and I am in complete
agreement. We've only used them as transitional flags that are
supposed to go away eventually (like -dip25 or -dip1000).
Whether the code is legal or not should not depend on the
compiler flags.
And honestly, showing stuff like
@core.attribute.GarbageCollectedness.gc in the DIP makes it
look _really_ bad.
That was an Illustrative mistake and I regret the confusion it
has caused. I should have used `@gc` with `@gc` being an alias
for @core.attribute.GarbageCollectedness.gc.
Sure, it might make sense from the standpoint of extensibility,
but it's ridiculously long. We already arguably have too much
of an attribute mess on your average non-templated function
signature without stuff like that.
This dip is intended to reduce the amount of attribute spam by
enabling defaults.
IMHO, if what we're trying to do is to be able to negate
attributes, then we should looking at doing something like
@nogc(false) or some other syntax that is about negation of an
existing attribute.
The DIP is more than that, the benefit of being regular
attributes (manipulation) and the ability to have configurable
defaults,
This DIP is going off on a huge tangent from that with no
justification as to why it would be worth the extra
complication or the breakage that it would cause.
This would cause _very_ little if any, non-deprecatable breakage.
And it looks like a _lot_ of extra complication in comparison
to what we have now.
The keyword-like attributes become regular attributes. I fail to
see how that makes them any more complicated, IMO it makes them
_less_ complicated (I am revising the DIP to remove the module
related stuff and have a last applied wins for multiple
attributes).