简单函数的参数数量错误

tob*_*yer 1 clojure

有人可以解释下面的Clojure代码中的行为吗?我不明白.Clojure会以某种方式替换或"优化"函数参数吗?为什么调用带有单个nil参数的函数会导致ArityException

(defn foo [bar] (reduce #(%1) bar))

(foo nil)
-> ArityException Wrong number of args (0) passed to: test$foo$fn  clojure.lang.AFn.throwArity (AFn.java:437)
Run Code Online (Sandbox Code Playgroud)

Mic*_*zyk 5

(doc reduce):

[...]如果coll不包含任何项,则f必须也不接受任何参数,并且reduce返回不带参数调用f的结果.[...]

这里是coll nil,它被有效地视为不包含任何项目的集合(因为它通常在类似的上下文中),并且f#(%1).

因此#(%1)没有参数被调用,最终抛出你看到的异常.