我尝试在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 不能从:java.lang.Long创建ISeq
clojure.lang.RT.seqFrom (RT.java:487)