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,则没有答案。
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 在应用错误数量参数的函数时有不同的期望,我现在确信在两个宿主上的行为都是合理的(而且它们之间的差异既可能令人困惑,但最终是可接受的)。
作为一个附带的思考,我想如果你使用 `reduce` 而不是 `apply`,你可以遵循 Rich Hickey 的建议,不要使用 `reduce` 的双参数版本

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