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`函数返回1个或多个数字中的最大值。当没有数字时没有答案。
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),JVM和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=>
...