可选尾随逗号的缺点是什么?
What are the downsides of optional trailing commas?
许多语言在其语法中都有如下几条规则,禁止尾随逗号:
call-expr: ident '(' expr-list? ')';
expr-list: expr | expr-list ',' expr;
但是,以下公式允许(但不要求)尾随逗号,其中有 well-known advantages:
call-expr: ident '(' expr-list? expr? ')';
expr-list: expr ',' | expr-list expr ',';
总是使用它是否有任何缺点,至少在内部?
缺点是允许空条目的歧义。考虑 Javascript 中的以下数组:
[1,,3]
[1,,3,]
它们相同吗?它们的长度相同吗?应该吗? (答案:是的,但在 IE<=7 中不是)
允许省略过程参数的语言(我特别想到旧的 HP 系统语言 SPL;可能还有其他语言)会失败,因为编译器会假定在该过程不需要的尾随逗号。我承认这是一个小缺点 - 另一方面,IMO 所述的好处同样很小。
许多语言在其语法中都有如下几条规则,禁止尾随逗号:
call-expr: ident '(' expr-list? ')';
expr-list: expr | expr-list ',' expr;
但是,以下公式允许(但不要求)尾随逗号,其中有 well-known advantages:
call-expr: ident '(' expr-list? expr? ')';
expr-list: expr ',' | expr-list expr ',';
总是使用它是否有任何缺点,至少在内部?
缺点是允许空条目的歧义。考虑 Javascript 中的以下数组:
[1,,3]
[1,,3,]
它们相同吗?它们的长度相同吗?应该吗? (答案:是的,但在 IE<=7 中不是)
允许省略过程参数的语言(我特别想到旧的 HP 系统语言 SPL;可能还有其他语言)会失败,因为编译器会假定在该过程不需要的尾随逗号。我承认这是一个小缺点 - 另一方面,IMO 所述的好处同样很小。