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),在JVM和JavaScript中关于应用参数数量错误的函数有不同的期望,我现在相信在两个宿主上的行为都是合理的(并且它们之间的差异既可能是令人困惑的,但最终是可以接受的)。
by
作为一个后来的想法,我想如果你使用`reduce`而不是`apply`,你可以遵循Rich Hickey的建议,不要使用`reduce`的两个arity版本

  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=>
...