Re: [RFC] Shorter attribute syntax
| From: | Theodore Brown | Date: | Thu, 04 Jun 2020 22:20:00 +0000 |
| Subject: | Re: [RFC] Shorter attribute syntax | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-110380@lists.php.net to get a copy of this message | ||
On Thu, June 4, 2020 at 12:19 PM Rowan Tommins <rowan.collins@gmail.com> wrote:
> Hi Theodore,
Hi Rowan,
Thanks for the feedback. I added replies inline.
> I find the "objective" reasons in this RFC to be greatly exaggerated.
>
> 1.
@@Jit does not require "half as many characters"
> as <<Jit>>;
> even for this, which is probably the shortest attribute anyone will
> ever use, the saving is less than 30%; for more common attributes
> which resemble entire function calls, it will be a tiny proportional
> saving.
By "half as many characters" the RFC is referring to the attribute
syntax itself, not the name/arguments of the attribute being used.
You're right that with longer attributes, the attribute syntax makes
up a smaller percentage of the code. However, I'd argue the savings
still has value even when it's a smaller proportion.
> 2. You don't actually explain why @@Foo would be any
> easier to
> integrate with nested attributes than <<Foo>>. Is
> there some
> parser conflict that applies to one and not the other?
Martin can correct me if I'm wrong here, but I believe nested attributes
are syntactically possible with the <<>> syntax, but "ugly as
sin"
(to quote Nikita). For example:
```php
<<JoinTable(
"User_Group",
<<JoinColumn("User_id", "id")>>,
<<JoinColumn("Group_id", "id")>>,
)>>
private $groups;
```
Also, grouped attributes would probably have to be special-cased to
be disallowed in nested attributes, since they don't make sense there.
During implementation a bunch of work was put into trying to support
nested attributes with new (e.g. new JoinColumn("User_id",
"id")),
but as the RFC mentions this was given up on since it turned out to be
very difficult to implement and would require lots of changes to const
expressions.
> 3. While confusion with generics is possible, I would be interested
> to hear from C# programmers how often they confuse [Attribute]
> for
> an array index operation, or any of the other uses of square brackets.
One reason I think confusion with generics is more probable is that
generics and attributes would frequently be used in a similar location
(near the start of a class declaration).
> 4. Similarly, I've yet to see anyone point to an example of confusion
> with shift operators that's not extremely contrived. I could come up
> with equally contrived examples where an attribute contained e-mail
> addresses and twitter handles, making @@ look confusing.
Perhaps, though this seems much less likely since email addresses and
twitter handles would be in a string, whereas << is a standalone
token used outside of strings.
> 5. No other language has been put forward using the @@
> operator. It
> more closely resembles those languages that use a single @, but
> the
> <<Foo>> syntax more closely resembles those
> languages that use some
> form of brackets.
Fair enough. This doesn't really seem like an argument one way or
another.
> I also find it disingenuous that you refer to the
> <<Foo>> syntax as
> "the shift tokens" throughout, but do not similarly call your proposed
> syntax "the double-suppression token". If one is "double-at", then the
> other is "double-angle-brackets".
I don't understand how it's disingenuous. The RFC refers to the shift
tokens as such because that's what they are (T_SL and T_SR). The
proposed @@ syntax uses a new T_ATTRIBUTE token.
> The one convincing *objective* argument I've seen is Jordi's, that
> @@ would be easily greppable. Interestingly, that's not
> true of
> any of the other languages listed in the comparison other than Rust's
> hash-bracket and maybe C++'s double-bracket, but that doesn't mean we
> can't do better.
Yes, I this is one reason I think having an @@ token is a good fit
for PHP, as preserving easy greppability has influenced other syntax
decisions as well (e.g. the placement of return types).
> Other than that, I think it really comes down to a matter of taste. Some
> people reacted to the <<Foo>> syntax the way they
> did to the Cats movie
> trailer, and may react to this one better. That's fine; we can make a
> decision for subjective reasons, but let's be honest and say that.
Well, I guess the line between objective and subjective may sometimes
be a bit subjective. :)
Best regards,
Theodore