我可以使用以“:”开头的方法定义Clojure协议吗?

时间:2011-04-12 10:43:26

标签: clojure

我想提供一些以:字符开头的clojure协议的方法。有没有办法在Clojure中覆盖它?

2 个答案:

答案 0 :(得分:3)

不要这么认为。 Clojure关键字在读者中实现,我认为没有任何方法可以覆盖这种行为。

当您使用关键字作为函数时,这相当于(get arg:keyword)。您可以通过在协议中实现ILookup来扩展它的功能。

Joost的。

答案 1 :(得分:3)

听起来像个坏主意:冒号是为关键字保留的,所以即使你能做到这一点,我认为它也会造成一些令人困惑的代码。

当然,您可以将函数放在由关键字映射的记录中:

(defrecord Foo [])

(def foo (Foo. nil {:method (fn [a b] (* a b))}))

((:method foo) 7 10)
=> 70

我发现这有时是一个有用的技巧......