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