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