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

Programming languages 为什么编程语言使用逗号分隔函数参数?,programming-languages,syntax,Programming Languages,Syntax,似乎所有编程语言都使用逗号(,)来分隔函数参数 他们为什么不只用空格呢?绝对不能。这个函数调用怎么样: function(a, b - c); 用空格代替逗号会怎么样 function(a b - c); 这是否意味着函数(a,b-c)或功能(a,b,-c)?逗号的使用可能来自数学,几个世纪以来,逗号一直用于分隔函数参数。类似Lisp的语言使用:(f arg1 arg2 arg3),这基本上就是您所要求的。 类ML语言使用连接来应用curried参数,因此您需要编写f arg1 arg2

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


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

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

 function(a, b - c);
用空格代替逗号会怎么样

 function(a b - c);

这是否意味着
函数(a,b-c)
功能(a,b,-c)?逗号的使用可能来自数学,几个世纪以来,逗号一直用于分隔函数参数。

类似Lisp的语言使用:
(f arg1 arg2 arg3)
,这基本上就是您所要求的。
类ML语言使用连接来应用curried参数,因此您需要编写
f arg1 arg2 arg3

首先,您的前提是false。有些语言使用空格作为分隔符(lisp、ML、haskell,可能还有其他语言)


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

这不是真的。有些语言不使用逗号。函数在编程构造之前是数学概念,因此一些语言保留了旧的符号。大多数较新版本都受到了C语言的启发(Javascript、Java、C#以及PHP,它们共享一些正式规则,如逗号)

你不必看得比我们的大多数自然语言更远,就能看到逗号用于分隔列表中的项目。因此,对于第一次学习编程语言的人来说,使用逗号以外的任何东西来枚举参数都是出乎意料的。

使用空格作为传递给命令的单词之间的分隔符。如果它有复合参数,则必须将其括起来或以其他方式引用。请注意,即使在这里,您也会发现逗号作为分隔符的用法——仅在表达式语法中——但这是因为符号在编程之外是常用的。很长一段时间以来,数学一直以这种方式编写n元函数应用程序;计算机(特别是Fortran)刚刚借用。

这听起来可能有点明智,但我认为,出于同样的原因,大多数地球语言(英语、法语和其他少数语言;-)使用它,而且对大多数人来说,它是直观的。

已经指出了一些历史原因

另外,这是因为在大多数语言中,
充当分隔符,空白序列在很大程度上被忽略,或者更准确地说,尽管它们可能是分开的,但它们本身并不充当标记。对于所有从C派生语法的语言来说,情况更是如此。空格序列非常类似于空单词,让空单词界定任何东西可能不是最好的主意

此外,我认为它更清晰,更容易阅读。为什么空白作为真正有意义的分隔符,而空白是不可见的字符,本质上只起格式化的作用。这只会引起歧义。卡尔提供了一个例子

第二个将
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
事实上,我有时倾向于在没有这种“特性”的语言中使用后一种表示法。JavaScript强制我格式化代码,因为有人有一个很酷的想法,使用ENTER而不是

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


有一些语言允许这样做,但是有很多原因,为什么他们这么做。首先也是最重要的是,因为一群非常聪明的人坐下来花了相当长的时间设计一种语言,然后发现它的语法使
在大多数情况下都过时了,因此决定取消它。

虽然有些语言使用空格,使用逗号可以避免不需要括号的歧义情况。一个更有趣的问题可能是为什么C使用与“A然后b”操作符相同的字符作为分隔符;后一个问题在某种程度上更有趣,因为C字符集至少有三个其他字符没有出现在任何上下文中(美元符号、商业at和grave),我知道其中至少有一个(美元符号)可以追溯到40个字符的punchcard集。

Haskell不使用逗号

范例

multList :: [Int] -> Int -> [Int]
multList (x : xs) y = (x * y) : (multList xs y) 
multList [] _ = []
在C/C++中使用逗号的原因是,如果没有逗号,读取没有分隔符的长参数列表可能会很困难

试试看这个

void foo(void * ptr point & * big list<pointers<point> > * t)
void foo(void*ptr点和*big list*t)
逗号和空格一样有用。在拉丁语中,没有空格、句点或小写字母

试试看这个

void foo(void * ptr point & * big list<pointers<point> > * t)
我非常喜欢你在我的背包里不想要什么

它主要是帮助你阅读东西

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

在脚本中包含逗号的自然语言中,该字符用于分隔事物。例如,如果您要在何处枚举水果,您可以编写:
“柠檬、橘子、草莓、葡萄”
,也就是说,使用逗号

因此,在函数中使用逗号分隔参数比使用其他字符(例如)更自然

考虑:

someFunction( name, age, location ) 
vs

someFunction(名称|年龄|位置)

他们为什么不只用空格呢

那是
f(a -b c)
def MyFunction(obj1, obj2, title as String, count as Int):       
    ...do stuff...