我在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)