2024 年 Clojure 状态调查! 分享你的想法。

欢迎!有关如何使用此功能的更多信息,请参阅 关于 页面。

0 投票
ClojureScript

cljs

ClojureScript 1.10.238
app:cljs.user=> (defn f [a] a) (f)
#'cljs.user/f
----  Compiler Warning on   <cljs form>   line:1  column:2  ----

  Wrong number of args (0) passed to cljs.user/f

  1  (f)
     ^--- 

----  Compiler Warning  ----
nil
app:cljs.user=> (defn f [a] a) (apply f [])
#'cljs.user/f
nil

clj

> (defn f [a] a) (f)
#'redacted.ns/f
Execution error (ArityException) at redacted.ns/eval28662 (form-init217321140160545149.clj:2261).
Wrong number of args (0) passed to: redacted.ns/f
> (defn f [a] a) (apply f [])
#'redacted.ns/f
Execution error (ArityException) at redacted.ns/eval28665 (form-init217321140160545149.clj:2265).
Wrong number of args (0) passed to: redacted.ns/f

在 cljs 中,apply 静默返回 nil,而在 clj 中,则抛出 ArityException

1 个答案

+1 投票

这是一个宿主环境差异。JavaScript 函数在调用时参数过多或过少时不会抛出异常。CLJS 并不会尝试改变这一点。

在直接函数调用中, cljs 可以警告你这一点。但你也可以关闭警告,代码仍然可以编译
但是,间接调用,如 apply,甚至 map,编译器无法推断它。
这是一个很好的补充,谢谢。
...