请在 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,编译器无法推断出来。
by
这是个很好的补充,谢谢。
...