All function attributes possible with "@"?
Jonathan M Davis via Digitalmars-d
digitalmars-d at puremagic.com
Wed Dec 14 19:56:56 PST 2016
On Thursday, 15 December 2016 at 00:08:12 UTC, 01010100b wrote:
> On Wednesday, 14 December 2016 at 20:41:57 UTC, Jonathan M
> Davis wrote:
> Actually slapping @ on all keywords would remove the
> inconsistency altogether, even if that isn't necessarily what I
> favour. Keywords which are also function attributes would seem
> a better set to allow @ on. While it is true that this reduced
> set of keywords would be "shuffling an inconsistency around"
> that still leaves open whether this inconsistency:
>
> final pure @nogc func()
> final class G{}
>
> is preferable over this one:
>
> @final @pure @nogc func()
> final class G{}
How on earth is that preferable? In the first case, every single
attribute is always the same. In the second, sometimes they have
@, sometimes they don't, and programmers would have to know when
which was used. And as soon as you slap @ on attributes that
exist in other languages, you've made D harder to learn, and
you've made it harder to port code from other languages to D.
>> But even worse, you're then introducing yet another way to do
>> exactly the same thing in D without it adding any new
>> functionality. There will be questions over what the
>> difference between @pure and pure is. There will be questions
>> about why you can use both @pure and pure, but you're forced
>> to use @safe instead of safe. There will be yet more arguments
>> over coding style and whether it's better to use @pure or pure.
>
> There will always be arguments over coding style, but this
> isn't one of them, it's about language design.
If you optionally allow @ on attributes, it definitely becomes a
question of coding style - e.g. some code will use pure and some
will use @pure. And you get all of the arguments over whether a
codebase should use @ or not and whether it's acceptable to mix
them. The only way that this does not become a coding style
question is if we change the keywords rather than having two
versions of them. Optional syntax pretty much always leads to
arguments about coding style.
>> Except that it isn't easier to learn, because you still have
>> stuff like pure and nothrow in addition to their @
>> counterparts, meaning that there's _more_ to learn
>
> Why would you need to learn pure or nothrow in addition to
> their @ counterparts?
>
>> It's terrible for learning
>
> No it isn't, less needs to be learned. You could think of the
> non-@ variants as deprecated.
Except that they wouldn't be. It would be completely up to
programmers to use one or the other. So, anyone using D would
have to be familiar with both. And _not_ having @ is what all
existing code does and what many programmers will prefer. So,
best case, both would be very common, and there's a decent chance
that the @ versions would always be in the minority. Changing
them only works if you force the change, which means _actually_
deprecating and removing the non-@ versions and breaking most D
programs in the process.
>> and it's terrible for collaboration.
>
> No more so than deciding on a variable naming or brace style.
Except that we don't need to add yet another coding standard
issue to argue over. This does _nothing_ except maybe improve
your ability to have aesthetically pleasing code if you think
that slapping @ on all of the attributes is aesthetically
pleasing (and a number of folks think that the @s are downright
ugly). Let's please not add optional syntax to the language over
an aesthetic issue.
>> If we could agree on a set of changes to make that made all of
>> this consistent, and we were willing to pay the cost of the
>> breakage that would result, then that would be one thing, but
>> optional syntax that looks like it should have a semantic
>> difference when it doesn't is just going to make the confusion
>> and questions worse, and it will add more fuel to the fire in
>> code style arguments.
>
> If you want to eliminate inconsistency while only paying the
> cost of breakage once, then how about this:
>
> Let # be a character, distinct from @, such that no legal
> identifier can begin with #. Then introduce a new set of
> keywords #pure, #nogc, #const, #nothrow etc, which can be used
> as attributes. Deprecate the previous syntax. After this
> language designers can add as many #attribute keywords as they
> want in the future, since they will never clash with users'
> identifiers by definition.
Except that most of us _don't_ want to break our code over this.
It's not worth it. @ is ugly. # is ugly. Both add unecessary
characters. Aesthetically speaking, it would be _way_ better ts
have them all be keywords, but we didn't want to have that many
keywords. And regardless, changing code over what attributes are
named really dosen't add much value. Sure, it would be nice to
not have to explain to newbies why some attributes have @ and
some don't. Having more consistency with regards to @ would be
nice. But at this point, it is _not_ worth breaking code over And
I would be stunned if you could convince Walter or Andrei that it
is. This is _exactly_ the sort of change that they think is
detrimental to the language. It's an aesthetic issue, not a
technical one. It doesn't cause problems beyond the fact that it
spmetimes has to be explained to newbies, because they figure
that the @ must mean something, when it really doesn't. And
changing what we do with @ would arguably make the language
_less_ visually appealing. So, it's not like we even all agree
that such a change is even nice in principle. If we all had full
agreement on a new syntax and that it was worth breaking our code
over, then maybe, but you're not going to get any kind of
consensus on what the syntax should be let alone on the change
being worth the breakage.
- Jonathan M Davis
More information about the Digitalmars-d
mailing list