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并不遵循其合同。这是一个实质上未定义的行为。

感谢你的答案,你能指出你所说的合同吗?
函数的最基本的签名。
你的观点非常到位。我会尝试提出一个关于具有这种签名的函数零arity应用更好的问题。谢谢!(
这是真的未定义行为。"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 在应用具有错误参数数量的函数时存在不同的预期,我现在相信这两个主机上的行为都是合理的(并且它们之间的差异既可能令人困惑,最终也是可以接受的)。
作为一个事后想法,我猜如果你使用 `reduce` 而不是 `apply`,你可以遵循 Rich Hickey 的建议,不要使用 `reduce` 的两个参数版本

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