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