我试图在一个 defprotocol 方法签名中使用 &;显然(见下文),这会被编译成将 &;作为一个简单的参数名称,并不会对可变数量的参数进行特殊处理。我认为在协议签名中使用 &;应该被检测到,并立即引发异常(我也认为应该对签名中的这种限制进行文档化;虽然我没有在当前文档中找到具体的说明,但显然(在我后来意识到这一点时)这是由 defprotocol 创建 Java 接口的事实所隐含的)。
user=> (defprotocol Applier (app (f & args)))
Applier
user=> (deftype A ((link: ) Applier (app (link: _ f & args) (prn f & args) (apply f args))))
user.A
user=> (app (A.) + 1 2)
<core$PLUS clojure.core$PLUS@5d9d0d20> 1 2
IllegalArgumentException 无法从:java.lang.Long 创建 ISeq
clojure.lang.RT.seqFrom (RT.java:487)