Clojure期望在收集中与ref匹配

时间:2014-06-30 19:05:44

标签: clojure partial

我有一个包含参考的集合。引用由被调用函数生成。如果参考值不同,我如何比较预期和实际集合,即使值相同?

这是一个更普遍问题的特例。 如何执行部分匹配,标记某些元素表明不需要完全匹配?

这个问题的重点与测试有关。 我有一个函数返回一个包含引用的表单,我想比较它,看它是否符合我的预期。

基于评论:

我做到了......

(defprotocol Ireference? (reference? [this]))
(extend-type java.lang.Object Ireference? (reference? [this] false))
(extend-type nil Ireference? (reference? [this] false))
(extend-type clojure.lang.Ref Ireference? (reference? [this] true))
(extend-type clojure.lang.Agent Ireference? (reference? [this] true))

(defn ref->str 
   "takes an arbitrary tree and replaces all futures 
   with agnostic strings."
   [form]
   (clojure.walk/postwalk #(if (reference? %) (list 'ref @%) %) form))

我想要的是什么。

(expect '{:foo (ref :bar) :baz {:zoo (ref :awk)}}
   (ref->str {:foo (ref :bar) :baz {:zoo (ref :awk)}})

这给了我一个匹配。

参考?谓词来自How do we test whether something is a reference?

1 个答案:

答案 0 :(得分:3)

按照设计,这不能像你所描述的那样在clojure中完成。您可以通过遍历结构并在所有可变类型上调用deref来生成可以进行比较的值,从而获得类似的效果。 Rich Hickey在this video(特别是24分钟)

中很好地解释了

两个值仅在某些时间相等是没有意义的。如果语言允许这样做,那么通过专注于使用可模拟值进行编程,它将失去很多力量。也许如果你将集合放在ref而不是集合中的ref中,事情会更容易推理出来吗?