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