0

我注意到 Coffeescript 中的可选括号引入了句法歧义。例如,代码

prompt Math.max(2), 3      # no space after max

编译为

prompt(Math.max(2), 3);    // one parameter to max(), two to prompt()

然而

prompt Math.max (2), 3     # space after max

编译为

prompt(Math.max(2., 3));    // two parameters to max(), one to prompt()

即在参数列表之前添加一个空格会改变参数的分组。

这是故意的吗?语言中是否还有其他地方可以使空格产生句法差异?

4

2 回答 2

1

是的,这是故意的。

CofeeScript 中变量后的空格表示:“将以下参数列表应用于此函数。

让我们看看你的代码:

prompt Math.max(2), 3

这意味着:“适用于prompt两个参数:Math.max(2)3”。

prompt Math.max (2), 3

这意味着:“应用于Math.max两个参数:(2)and 3,然后将结果应用于prompt”。

让我们看看更复杂的例子:

my_function (obj = other_function 1, 2), some_var

在此示例中,括号是必需的。

此功能允许您以两种方式编写相同的代码:

my_function (my_array.map (x) -> do_smth x), some_var

是相同的

my_function my_array.map((x) -> do_smth x), some_var

我不知道该语言中的任何其他地方,其中空格会产生句法差异。但是有一个地方,括号会有所不同:

my_object = one: two: three: 'three', four: 'four'
=>
my_object = {one: {two: {three: 'three', four: 'four'}}}

my_object = one: {two: three: 'three'}, four: 'four'
=>
my_object = {one: {two: {three: 'three'}, four: 'four'}}
于 2012-09-20T13:17:21.723 回答
1

在您的示例中,括号的含义完全不同。

prompt Math.max(2), 3

在这里,您max使用唯一的参数调用该函数2。括号是函数调用的一部分。很明显,max将使用此参数调用。

prompt Math.max (2), 3

在这种情况下,括号是表达式 (2)的一部分,将被简化为2。您省略了函数调用的可选括号。

那么,这是故意的吗?是的,我会这么说,没有太多不同的解释空间。如需进一步参考,请参阅 coffeescript style guide。它没有明确提到函数名和它的括号之间不应该有空格,但是所有的例子都是这样写的。

于 2012-09-20T13:17:39.263 回答