CoffeeScript:如何做f(a(1),b(2),c(3))无扎带风格?

时间:2013-12-26 15:20:38

标签: coffeescript

f5 = (x) -> 500 + x
f6 = (x) -> 600 + x
f7 = (x) -> 700 + x
console.log (f5 5, f6 6, f7 7)             # prints 505
console.log(f5 5, f6 6, f7 7)              # prints 505
console.log f5 5, f6 6, f7 7               # prints 505
console.log(f5(5), f6(6), f7(7))

只有最后一次调用console.log才能正常工作:打印505 606 707。 但那是JavaScript风格(或者我应该提一下Lisp?),可以用CoffeeScript风格来实现吗?

3 个答案:

答案 0 :(得分:3)

我可以看到两个问题的解决方案。

首先是使用括号:

console.log (f5 5), (f6 6), (f7 7)

第二个是将console.log分成多行:

console.log (f5 5),
  f6 6
  f7 7

不幸的是,函数的第一个参数应该与函数本身在同一行。这意味着在你的例子中没有办法完全摆脱括号。

答案 1 :(得分:1)

这是您的代码转换为:

var f5, f6, f7;

f5 = function(x) {
  return 500 + x;
};

f6 = function(x) {
  return 600 + x;
};

f7 = function(x) {
  return 700 + x;
};

console.log(f5(5, f6(6, f7(7))));  //505
console.log(f5(5, f6(6, f7(7))));  //505
console.log(f5(5, f6(6, f7(7))));  //505
console.log(f5(5), f6(6), f7(7));  //505, 606, 707

因此,在您的第一个 3 日志中,您调用的f5只接受一个参数,因此忽略其余参数。


可以做的是:

console.log(
   f5 5
   f6 6
   f7 7 
 )

多行强制它作为单独的函数运行

您可以对对象执行相同操作,将换行符添加逗号:

obj = 
    a: 42
    b: 23

答案 2 :(得分:0)

中心问题是,一旦你给出它:

console.log f5 5  # compiles to console.log(f5(5));

如果没有f6(6),则无法向6添加其他参数(例如console.log甚至只是())。我尝试使用换行符,逗号和缩进的每一件事都会产生错误或产生

console.log(f5(5, f6(6)));

换句话说,你如何明确地告诉它f6 6console.log而不是f5的论据? Coffeescript不会分析这些函数来确定每个函数可以采用多少个参数。实际上在Javascript中,通过扩展Coffeescript,函数没有固定的签名。

除了询问编译器将处理什么之外,请问您清楚的是什么?如果你看到:

foo one two, three four

并且对这些变量一无所知,你会如何解释它?