我尝试在 defprotocol 中的方法签名中使用 &。显然(见下文),这样编译会使 & 成为简单的参数名称,并且没有对可变数量参数的特殊处理。我认为在使用协议签名时应检测 & 的使用,并立即抛出异常(我也认为这个签名上的限制应该被记录在文档中;尽管在文档中未指定(当然,后来意识到是由 defprotocol 创建的 Java 接口暗示的))。
user=> (defprotocol Applier (app this f & args))
Applier
user=> (deftype A () Applier (app _ 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)