请分享您的想法至 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 并未遵守其合同。这是一种实际未定义的行为。

感谢您的回答,您能否指出您所指的是哪个合同?
by
函数的确切签名。
by
您说的话很到位。我会尝试用这些签名的函数零参数应用来提出一个更好问题。谢谢!(
by
这实际上是未定义行为。“max”返回一个或多个数字中的最大值。如果没有数字,则没有答案。
0
by

您可能会说这是因为 max 没有合理的、普遍的标识值(min 同样如此),但您可以选择自己的一个,例如 Integer/MIN_VALUE

user=> (apply max Integer/MIN_VALUE [])
-2147483648
user=> (apply max Integer/MIN_VALUE [2])
2
user=> 
by
我赞赏这个想法,明确界限是一个好主意。我认为我们在后续问题中更接近混乱的根源了(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) 在 user/eval9 (REPL:1)。
  传递给 clojure.core/max 的参数数量错误(0)
  user=> (reduce max Integer/MIN_VALUE [])
  -2147483648
  user=> (reduce max Integer/MIN_VALUE [2])
  2
  user=>
...