似乎所有编程语言都使用逗号(,)来分隔函数参数。
为什么他们不使用空格呢?
答案 0 :(得分:56)
绝对不是。这个函数调用怎么样:
function(a, b - c);
如何使用空格而不是逗号?
function(a b - c);
这是function(a, b - c);
还是function(a, b, -c);
?逗号的使用大概来自于数学,几个世纪以来,逗号被用来分隔函数参数。
答案 1 :(得分:47)
首先,你的前提是错误的。 是语言,它们使用空格作为分隔符(lisp,ML,haskell,可能还有其他语言)。
大多数语言不支持的原因可能是a)f(x,y)
是大多数人习惯使用数学的符号,b)使用空格会产生大量嵌套括号(也称为“lisp效应”) )。
答案 2 :(得分:12)
类似Lisp的语言使用:(f arg1 arg2 arg3)
这基本上就是你所要求的。
类似ML的语言使用连接来应用curried参数,因此您可以编写f arg1 arg2 arg3
。
答案 3 :(得分:6)
Tcl使用space作为传递给命令的单词之间的分隔符。如果它有复合参数,则必须加括号或以其他方式引用。请注意,即使在那里你会发现使用逗号作为分隔符 - 仅在表达式语法中 - 但这是因为符号在编程之外是常用的。数学已经写了很长时间的 n - 函数应用程序;计算(特别是Fortran)刚刚借用。
答案 4 :(得分:5)
已经指出了许多历史原因。
另外,这是因为在大多数语言中,,
用作分隔符,空格序列在很大程度上被忽略,或者更确切地说,虽然它们可以分开tokens,但它们本身并不作为标记。对于从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
事实上,我有时倾向于在语言中使用后一种符号,而没有这种“特征”。 JavaScript强制一种方式来格式化我的代码,因为有人有一个很酷的想法,即使用ENTER代替;
。
我认为,有一些很好的理由说明为什么某些语言会如此。特别是在动态语言(如PHP)中,没有编译时间检查,编译器可能会警告您,它解决上面给出的歧义的方式与您想要进行的调用的签名不匹配。你会有很多奇怪的运行时错误和非常艰难的生活。
有些语言允许这样做,但有很多原因,为什么会这样做。首先,因为一群非常聪明的人坐下来花了相当长的时间设计一种语言然后发现,它的语法使,
大部分时间都过时,因此决定消除它。
答案 5 :(得分:4)
您不必比我们的大多数自然语言更进一步看到逗号用于列表中的分隔项。因此,对于任何第一次学习编程语言的人来说,使用逗号以外的任何内容来枚举参数都是出乎意料的。
答案 6 :(得分:3)
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)
逗号像空格一样有用。在拉丁语中,没有用空格,句号或小写字母书写。
试试这个
IAMTHEVERYMODELOFAWHATDOYOUWANTNOTHATSMYBUCKET
主要是为了帮助您阅读。
答案 7 :(得分:2)
事实并非如此。有些语言不使用逗号。在编程构造之前,函数已经是数学概念,因此一些语言保留了旧的符号。比起大多数新版本都受到了C的启发(Javascript,Java,C#,PHP也是如此,它们共享一些像逗号这样的正式规则)。
答案 8 :(得分:2)
这可能听起来有点明智但我收集的原因与大多数地球行星语言使用它的原因相同(英语,法语和其他少数人;-)此外,它对大多数人来说都很直观
答案 9 :(得分:2)
虽然某些语言确实使用空格,但使用逗号可避免出现模糊情况而无需使用括号。一个更有趣的问题可能是为什么C使用与用于“a then b”运算符的分隔符相同的字符;后一个问题在某些方面更有意思,因为C字符集中有三个其他字符没有出现在任何上下文中(美元符号,商业广告和坟墓,我至少知道其中一个(美元符号) )可以追溯到40个字符的穿孔卡片。
答案 10 :(得分:2)
似乎所有编程语言都使用逗号(,)来分隔函数参数。
在脚本中包含逗号的自然语言中,该字符用于分隔事物。例如,如果你在哪里枚举水果,你会写:"lemon, orange, strawberry, grape"
也就是说,使用逗号。
因此,使用逗号分隔函数中的参数比使用其他字符更自然(例如)
考虑一下:
someFunction( name, age, location )
VS。
someFunction(name | age | location)
为什么他们不使用空格呢?
多数民众赞成可能。 Lisp做到了。
主要原因是,space已用于分隔令牌,并且更容易不分配额外的功能。
答案 11 :(得分:1)
我用不少语言进行了编程,虽然逗号不是最重要的,但它肯定在前面。逗号很好,因为它是一个可见的字符,因此可以通过删除空格而不破坏脚本来压缩脚本。如果你有空间,那么你可以有标签,这可能是一个痛苦......在一行的末尾有新行和空格的问题。每天给我一个逗号,你可以看到它,你知道它做了什么。空格是为了便于阅读(通常),逗号是语法的一部分。请注意,有许多例外情况需要空间或必需空间。我也喜欢大括号。
答案 12 :(得分:0)
这可能是传统。如果他们使用空间,他们就无法将表达作为参数传递,例如。
f(a-b c)
与
非常不同f(a -b c)
答案 13 :(得分:0)
某些语言(如Boo)允许您指定参数类型或将其保留,如下所示:
def MyFunction(obj1, obj2, title as String, count as Int):
...do stuff...
含义:obj1和obj2可以是任何类型(继承自object),其中title和count必须分别是String和Int类型。使用空格作为分隔符很难做到这一点。