2014-06-30 21 views
0

我有一個包含參考的集合。該引用由被調用函數生成。鑑於參考值不同,即使值相同,我如何才能比較預期收集和實際收集?Clojure期望與集合中的ref匹配

這是一個更普遍問題的特例。 如何執行部分匹配,標記某些指示不需要完全匹配的元素?

這個問題的重點與測試有關。 我有一個函數返回一個包含引用的表單,我想比較它是否符合我的預期。

基於評論:

我已經這樣做了......

(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

我想我在標題中提到'期望'並沒有說明我在談論測試。我添加了一些示例代碼。進行自頂向下的TDD時只需要部分匹配就很常見。 – phreed

+0

另外,爲什麼沒有'參考?'功能? – phreed

回答

3

這,設計,不能在clojure中完成,因爲你已經描述了它。您可以通過遍歷結構並在所有可變類型上調用deref來產生一個可以進行比較的值。正如Rich Hickey在this video(特別是24分鐘英寸)中很好地解釋的那樣

對於兩個值只有一些時間相等沒有意義。如果語言允許這樣做,它將失去通過專注於具有可模擬值的編程而獲得的許多權力。也許如果你把集合放在ref中而不是集合中的ref,那麼事情會更容易推理?

+0

是的,與deref的散步是我需要的。有很多事情我不在乎它們在進行測試時是否匹配(時間戳,引用id,gensyms等)。或者我錯過了什麼? – phreed