代码之家  ›  专栏  ›  技术社区  ›  polygenelubricants

程序设计语言语法中尾随逗号的历史

  •  17
  • polygenelubricants  · 技术社区  · 15 年前

    许多编程语言在语法中允许在列表中的最后一项后加逗号。假设这样做是为了简化自动代码生成,这是可以理解的。

    举个例子,下面是一个完全合法的Java数组初始化( JLS 10.6 Array Initializers ):

    int[] a = { 1, 2, 3, };
    

    我很好奇,是否有人知道哪种语言是第一个允许使用这些尾随逗号的语言。很明显C有。 as far back as 1985 .

    另外,如果有人知道现代编程语言的其他语法“特性”,我也会非常感兴趣地听到这些语法。我读到过,例如,Perl和Python在允许语法的其他部分使用尾随逗号方面更为自由。

    4 回复  |  直到 10 年前
        1
  •  4
  •   T.E.D.    15 年前

    我不是逗号专家,但我知道标准pascal对分号的声明非常挑剔。 分离器 不是 终结者 . 这意味着如果你不想被编译器骂的话,你必须非常小心地把它放在哪里。

    后来帕斯卡风格的语言(C、modula-2、ada等)编写了它们的标准来接受奇怪的额外分号,而不会表现得像在蛋糕混合中撒尿一样。

        2
  •  4
  •   polygenelubricants    15 年前

    我刚发现G77 Fortran编译器 -fugly-comma Ugly Null Arguments 旗子,虽然有点不同(顾名思义,相当难看)。

    这个 -逗号逗号 选项允许使用单个尾随逗号来表示__将实际参数列表中的额外尾随空参数__传递给外部过程,并使用此类过程的空参数列表来表示__传递单个空参数__。

    例如, CALL FOO(,) 表示_156;传递两个空参数_,而不是_156;传递一个空参数_。也, CALL BAR() 表示_156;传递一个空参数__。

    不过,我不知道这首歌是用哪一种语言出现的。

        3
  •  2
  •   Norman Ramsey    15 年前

    [有人知道]现代编程语言的其他语法“特性”?

    我的最爱之一, Modula-3 这是1990年设计的,尼克劳斯·沃特的祝福是当时“帕斯卡家族”中最新的语言。还有人记得那些吗 关于分号应该是什么的激烈争论 分离器 或A 终结者 ? 在模块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.目标凸轮允许使用 γ 在case表达式中,早期和密切相关的方言标准ml没有。因此,在标准的ML代码中,case表达式通常更丑。


    编辑 :看到t.e.d.的答案后,我检查了modula-2语法,他是正确的,modula-2还支持分号作为结束符,但是通过空语句的设备,这使得

    x := x + 1;;;;;; RETURN x
    

    合法的。我想这不是坏事。模块2不允许灵活使用分动箱 | 然而,这似乎起源于模-3。

        4
  •  2
  •   Norman Ramsey    15 年前

    使我苦恼的是,尽管它允许在 初始化器 名单,它确实 允许在 枚举器 列表(用于定义枚举类型的文本)。这种小小的矛盾比我承认的要严重得多。毫无理由!