2
据我所知,Clojure使解决“表达问题”变得“容易”。在Clojure中,我如何添加对常见功能(如空)的支持?并算上我的新类型?
但我找不到详细信息如何做到这一点。我如何创建一个新的类型(如defrecord)来处理空的事情?并数数?
据我所知,Clojure使解决“表达问题”变得“容易”。在Clojure中,我如何添加对常见功能(如空)的支持?并算上我的新类型?
但我找不到详细信息如何做到这一点。我如何创建一个新的类型(如defrecord)来处理空的事情?并数数?
这两个示例empty?和count函数是Clojure核心的一部分,它们的实现是由性能考虑驱动的,所以它们可能不是解决expression problem的最佳示例。总之:
示例代码:
(deftype Tuple [a b]
clojure.lang.Counted
(count [_] 2)
clojure.lang.Seqable
(seq [_] (list a b)))
(count (->Tuple 1 2)) ;=> 2
(empty? (->Tuple 1 2)) ;=> false
一种新的功能更一般的解决办法是要么:
defmethod
)。extend-protocol
或extend-type
使这些类型满足协议。无论哪种情况,您都可以随时为新或现有类型创建默认实现和新实现。即使在运行时!
值得注意的是,你不能对'defrecord'类型做这个,它们应该是类似map的,并且带有不能替换的各种map接口的内置实现。要构建没有内置行为的自定义类型,您必须使用'deftype',就像这个答案一样。 – amalloy