许多编程语言允许在列表中的最后一项之后的语法中使用逗号。据说这是为了简化自动代码生成,这是可以理解的。
例如,以下是Java(JLS 10.6 Array Initializers)中完全合法的数组初始化:
int[] a = { 1, 2, 3, };
我很好奇是否有人知道哪种语言首先允许使用这些尾随逗号。显然C有它as far back as 1985。
另外,如果有人知道现代编程语言的其他语法“特性”,我也会非常有兴趣听到这些语言。我读到例如Perl和Python在语法的其他部分允许使用尾随逗号时更加自由。
答案 0 :(得分:4)
我刚刚发现g77 Fortran编译器有-fugly-comma
Ugly Null Arguments标志,虽然它有点不同(顾名思义,相当难看)。
-fugly-comma
选项允许使用单个尾随逗号来表示在外部过程的实际参数列表中“传递额外的尾随空参数”,并使用这个过程的空参数列表表示“传递单个空参数”。例如,
CALL FOO(,)
表示“传递两个空参数”,而不是“传递一个空参数”。此外,CALL BAR()
表示“传递一个空参数”。
我不确定这首次出现的语言版本是什么。
答案 1 :(得分:4)
我不是逗号的专家,但我知道标准Pascal对于分号是分隔符而不是终结符非常持久。这意味着如果您不想被编译器大吼大叫,您必须非常小心地放置一个。
后来Pascal式的语言(C,Modula-2,Ada等)编写了他们的标准,以接受奇怪的额外分号,而不像你只是在蛋糕混合物中撒尿。
答案 2 :(得分:2)
[有谁知道]现代编程语言的其他语法“特点”?
我的最爱之一Modula-3是1990年设计的,Niklaus Wirth的祝福是“帕斯卡家族”当时最新的语言。还有其他人还记得那些关于分号应该是分隔符或终结者的可怕战斗吗?在Modula-3中,选择权在你手中!一系列陈述的EBNF是
stmt ::= BEGIN [stmt {; stmt} [;]] END
同样,在CASE
语句中编写替代项时,Modula-3允许您使用竖线|
作为分隔符或前缀。所以你可以写
CASE c OF
| 'a', 'e', 'i', 'o', 'u' => RETURN Char.Vowel
| 'y' => RETURN Char.Semivowel
ELSE RETURN Char.Consonant
END
或者你可以放弃最初的标准,也许是因为你更喜欢在那个位置写OF
。
我认为我喜欢和设计本身一样的是设计师意识到宗教战争正在进行,他们坚持不懈地寻找支持双方的方法。 让程序员选择!
P.S。目标Caml允许在案例表达中允许使用|
,而早期和密切相关的方言标准ML则不允许。因此,案例表达式在标准ML代码中通常更为明显。
编辑:在看到TED的答案后,我检查了Modula-2语法并且他是正确的,Modula-2也支持分号作为终结符,但通过空语句的设备,这使得东西喜欢
x := x + 1;;;;;; RETURN x
法律。我想这不是一件坏事。然而,Modula-2不允许灵活使用案例分隔符|
;这似乎起源于Modula-3。
答案 3 :(得分:2)
总是让我了解C的一点是,虽然它允许 intializer 列表中有一个额外的尾随逗号,但它不允许一个额外的尾随逗号< em>枚举器列表(用于定义枚举类型的文字)。这种小小的不一致使我陷入困境的次数比我承认的要多。并且无缘无故!