使用Clojure函数,我可以定义:
(defn f [x & xs] (apply some-function x xs))
我试图使用协议来实现类似的事情,例如:
(defprotocol foo
(bar [f])
(baz [f & gs]))
这段代码可以编译(至少在REPL中),但所有实现该方法的类型似乎都无法通过(变参方法baz)。这是官方不支持吗?我参考的资料没有提到。
由于Stuart Sierra的原因,这是不被支持的。稍微详细地说,&
符号只在解构上下文中(如let
或函数参数)才具有特殊意义。正如Stuart所指出的那样,defprotocol
不是这样的上下文。
但是,&
仍然是一个合法的符号,因此您定义了一个包含两个函数的协议:bar
接受一个名为f
的参数,baz
接受三个参数,分别为f
、&
和gs
。