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`的两个参数版本

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