2024 Clojure调查!中分享您的想法。

欢迎!请参阅关于页面以获取更多有关此信息。

+1 点赞
ClojureScript

cljs

app:cljs.user=> (apply max [])
nil

clj

> (apply max [])
Execution error (ArityException) at redacted.ns/eval26821 (form- 
init217321140160545149.clj:741).
Wrong number of args (0) passed to: clojure.core/max

不确定我更倾向于哪种行为(也许是 cljs?),但这种方法在我们的应用程序中产生了出乎意料的结果。

2 个回答

0 点赞

“意料之外”,因为调用没有任何参数的 `max` 不符合其合约。这实际上是一种未定义的行为。

感谢您的回答,您能指出您所提到的合约吗?
函数签名的本质。
你的观点很好。我将尝试提出一个关于具有类似签名的函数零参数应用方面更好的问题。谢谢!(
这实际上是未定义的行为。`max` 返回一个或多个数字中的最大值。如果没有数字,则没有结果。
0 点赞

你可能会争辩说这是因为 `max` 没有一个合理、普遍的恒等值(`min` 也是如此),但你可以选择自己提供一个,例如 Integer/MIN_VALUE

user=> (apply max Integer/MIN_VALUE [])
-2147483648
user=> (apply max Integer/MIN_VALUE [2])
2
user=> 
感谢这个想法,并且明确指出边界是一个好主意。我认为我们在后面的这个问题中(https://ask.clojure.org/index.php/12051/apply-behaves-differently-in-clj-cljs-with-empty-argument) 更接近混淆的根本,Java虚拟机和JavaScript在应用错误数量的参数函数上存在不同的预期,现在我确信在两个宿主上的行为都是合理的(它们之间的区别既可能令人困惑,最终也是可以的)。
by
作为后续的想法,我想如果你使用 `reduce` 而不是 `apply`,你可以遵循 Rich Hickey 的建议,不要使用 `reduce` 的两个参数版本

  user=> (reduce max [])
  执行错误 (ArityException) 在用户/eval9 (REPL:1).
  传递给clojure.core/max的参数数量错误(0)
  user=> (reduce max Integer/MIN_VALUE [])
  -2147483648
  user=> (reduce max Integer/MIN_VALUE [2])
  2
  user=>
...