Clojure的协议函数是否可以像普通函数一样具有可变参数?

11

使用Clojure函数,我可以定义:

(defn f [x & xs] (apply some-function x xs))

我试图使用协议来实现类似的事情,例如:

(defprotocol foo
  (bar [f])
  (baz [f & gs]))

这段代码可以编译(至少在REPL中),但所有实现该方法的类型似乎都无法通过(变参方法baz)。这是官方不支持吗?我参考的资料没有提到。

2个回答

12

由于Stuart Sierra的原因,这是不被支持的。稍微详细地说,&符号只在解构上下文中(如let或函数参数)才具有特殊意义。正如Stuart所指出的那样,defprotocol不是这样的上下文。

但是,&仍然是一个合法的符号,因此您定义了一个包含两个函数的协议:bar接受一个名为f的参数,baz接受三个参数,分别为f&gs


1
请注意,有一个 Jira 问题来标记在此上下文中使用 & 作为错误。http://dev.clojure.org/jira/browse/CLJ-888 - Alex Miller

10

正如Stuart Sierra在以下线程中回答的那样,Clojure不支持可变参数方法,并且将来可能也不会支持。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接