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