On Fri, Aug 7, 2020 at 6:03 AM Derick Rethans <der...@php.net> wrote:
> On Fri, 7 Aug 2020, Theodore Brown wrote: > > > Even if we assume the implementation is only about 30 lines, it's > > still extra complexity that I don't understand the benefit of. I > > sincerely would like to know what advantage there is of grouped > > attributes over the `@@` syntax. > > It was very *specifically* voted for: > https://wiki.php.net/rfc/attribute_amendments#group_statement_for_attributes Hi Derick, It was specifically voted for the `<<>>` syntax, with the explicit qualification that "This feature would be superseded by any other RFC getting accepted that changes the syntax." This is exactly what happened when the Shorter Attribute Syntax RFC was accepted. > You still haven't addressed any of the deficiencies that the other > alternatives don't have: > https://wiki.php.net/rfc/shorter_attribute_syntax_change#proposal I'm not sure which deficiencies you mean, but let's briefly go through the table in the RFC to make sure nothing has been missed: - Number of required Characters: - `@@` has the advantage here. - Has End Delimiter: - This isn't clearly a pro or a con in itself. - Allows Grouping: - As discussed before, `@@` has the advantage of being equally concise without this added complexity. - Forward Compatibility in PHP 7: - This is at best a temporary benefit of `#[]` which will be irrelevant in a few years, at worst a source of confusion and bugs when code intended for PHP 8 runs on PHP 7 with different results. - Breaks BC of valid PHP 7 code: - All syntaxes but `<<>>` technically have a BC break. There really should be a separate line in the table for "Breaks useful syntax", since `#[]` and `@[]` have this deficiency, but `@@` does not. - Used by other language: - This is listed as an advantage for `#[]` and `<<>>`. However, the table fails to point out that Hack is migrating away from `<<>>` to `@Attr`. Furthermore, while `#[]` has the same start/end symbols as Rust, the rest of the grammar/semantics vary significantly. E.g. these are valid Rust attributes (see https://doc.rust-lang.org/reference/attributes.html): #[rustfmt::skip] struct S {} #[clippy::cyclomatic_complexity = "100"] pub fn f() {} This is quite different from PHP's semantics, so it's not clear that copying the same start/end symbol would really be a benefit for us. Also note that unlike PHP, `#` does not start a comment in Rust. - Familiar with Docblock Usage: - `@@` has the advantage here once more. - Tokens used: - This isn't clearly a pro or con in itself. - Changes the lexing of **remaining** tokens: - This is apparently a con for `#[]`. Ultimately I think `@@` does the best job balancing a very small BC break with concise, familiar syntax that can cleanly support nested attributes in the future. And since it avoids the need for attribute grouping it also has the simplest implementation. Kind regards, Theodore -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: https://www.php.net/unsub.php