我尝试在defprotocol方法签名中使用&。显然(见下文),这样就编译成了将&作为简单的参数名,没有对可变数量参数进行特殊处理。我认为在协议签名中使用&应该被检测到并立即抛出异常(我也认为应该在这个签名的限制中加以说明;尽管当然它隐含着(如我后来意识到的那样)defprotocol创建的是一个Java接口)。
user=> (defprotocol Applier (app (link: this 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 Don't know how to create ISeq from: java.lang.Long
clojure.lang.RT.seqFrom (RT.java:487)