为什么编程语言使用逗号分隔函数参数?

Ema*_*sev 19 syntax programming-languages

似乎所有编程语言都使用逗号(,)来分隔函数参数.

为什么他们不使用空格呢?

Car*_*rum 56

绝对不.这个函数调用怎么样:

 function(a, b - c);
Run Code Online (Sandbox Code Playgroud)

用空格而不是逗号看起来怎么样?

 function(a b - c);
Run Code Online (Sandbox Code Playgroud)

这是意味着function(a, b - c);还是function(a, b, -c);?逗号的使用大概来自于数学,其中使用逗号分隔几个世纪的函数参数.

  • 在使用空格作为分隔符的语言中(lisp,ml,haskell),这看起来像lisp中的`function a(b - c)`(或`(function a( - bc))`. (21认同)
  • 功能(a(b - c)); ?:) (9认同)
  • +1提及数学; 这绝对是这个符号起源的地方. (7认同)
  • 因此,在这些情况下,括号用于消除参数的歧义.我正在将OP的问题解释为"你不认为在目前使用逗号的语言中,空间将是一个更好的分隔符".在这种情况下,可以使用括号加空格,但这比逗号有什么优势? (4认同)
  • 你的例子导致歧义只是因为" - "既是一元运算符又是二元运算符.如果你摆脱这种歧义,那么使用空间变得可行.就像任何其他二元运算符一样:函数(ab ^ c)或函数(ab 0 ^ c) (3认同)

sep*_*p2k 47

首先,你的前提是错误的.有使用空格作为分隔符(口齿不清,ML,Haskell中,可能还有其他人)语言.

大多数语言不这样做的原因可能是a)f(x,y)是大多数人习惯使用数学的符号和b)使用空格导致大量嵌套括号(也称为"lisp效应").

  • 对函数调用使用较少的括号不会导致更多的括号.导致大量括号的是从许多需要以某种方式(以任何语言)分组的部分构建大表达式.在lisp括号中基本上是唯一的结构符号,而其他语言也使用`,;.{}`...因此,由于括号实现了所有这些符号的功能,你当然可以得到更多它们(但是更少的括号,... .) (6认同)
  • 然后是Haskell $运算符,用于消除最终项周围的一组父母,例如sum(foo 3(bar 23 5))相当于sum $ foo 3 $ bar 23 5. (2认同)

小智 12

类似Lisp的语言使用:(f arg1 arg2 arg3)这基本上就是你所要求的.类似ML的语言使用连接来应用curried参数,所以你会写f arg1 arg2 arg3.

  • @Emanuil:Ocaml和F#是"流行的"ML方言. (2认同)

Don*_*ows 6

Tcl使用space作为传递给命令的单词之间的分隔符.如果它有复合参数,则必须加括号或以其他方式引用.请注意,即使在那里你会发现使用逗号作为分隔符 - 仅在表达式语法中 - 但这是因为符号在编程之外是常用的.数学已经写了很长时间的n- function函数应用程序; 计算(特别是Fortran)只是借来的.


Mla*_*vić 5

您不必比我们的大多数自然语言更深入地了解逗号用于分隔列表中的项目。因此,对于第一次学习编程语言的人来说,使用逗号以外的任何东西来枚举参数都是意料之外的。


bac*_*dos 5

已经指出了许多历史原因.

而且,这是因为在大多数语言中,,作为分隔符,空格序列在很大程度上被忽略,或者更确切地说,尽管它们可能分隔标记,但它们本身并不作为标记.对于从C语言派生语法的所有语言来说,这都是无效的.空白序列很像空字,空字分隔任何可能不是最好的想法.

此外,我认为它更清晰,更容易阅读.为什么有空格,它们是不可见的字符,并且基本上只提供格式化的目的,作为真正有意义的分隔符.它只会引入歧义.一个例子是Carl提供的.

第二个会f(a (b + c)).现在是那个f(a(b+c))还是f(a, b+c)

JavaScript的创建者有一个非常有用的想法,类似于你的想法,它产生了同样的问题.这个想法是,;如果声明完成,ENTER也可以作为.注意:

function a() {
    return "some really long string or expression or whatsoever";
}

function b() {
    return 
          "some really long string or expression or whatsoever";
}
alert(a());//"some really long string or expression or whatsoever"
alert(b());//"undefined" or "null" or whatever, because 'return;' is a valid statement
Run Code Online (Sandbox Code Playgroud)

事实上,我有时倾向于在语言中使用后一种符号,而没有这种"特征".JavaScript强制一种方式来格式化我的代码,因为有人有一个很酷的想法,使用ENTER代替;.

我认为,有一些很好的理由说明为什么有些语言是这样的.特别是在动态语言(如PHP)中,没有编译时检查,编译器可能会警告您,它解决上面给出的歧义的方式与您想要进行的调用的签名不匹配.你会遇到许多奇怪的运行时错误和非常艰难的生活.

有些语言允许这样做,但有很多原因,为什么会这样做.首先,因为一群非常聪明的人坐下来花了相当长的时间设计一种语言然后发现,它的语法在,大多数时候都过时了,因此决定消除它.