有没有一种很好的方法来打印出clojure数据结构的差异?例如,在Perl中,Test::Differences有很多帮助。
答案 0 :(得分:10)
看看clojure.data/diff:http://clojure.github.io/clojure/clojure.data-api.html#clojure.data/diff
示例:
async-demo.core> (use 'clojure.data)
nil
async-demo.core> (diff {:a 2 :b 4} {:a 2})
({:b 4} nil {:a 2})
async-demo.core> (diff [1 2 3 4] [1 2 6 7])
[[nil nil 3 4] [nil nil 6 7] [1 2]]
async-demo.core> (diff #{"one" "two" "three"} #{"one" "fourty-four"})
[#{"two" "three"} #{"fourty-four"} #{"one"}]
答案 1 :(得分:4)
您还可以使用gui-diff库在视觉上区分两个数据结构。
(gui-diff {:a 1} {:a 2})
将向适合OS的gui diffing程序发出异议,以区分两个可能非常大的数据结构。
答案 2 :(得分:2)
我真正搜索的是difform。使用clojure.data/diff
很不错,但在比较较大结构的单元测试中效果不佳。以下是data/diff
在我看来表现不同的例子:
(defn example []
(let [data [{:foo 1} {:value [{:bar 2}]}]]
(diff data
[{:value [{:bar 2}]}])
(difform data
[{:value [{:bar 2}]}])))
;; => diff output
;; => [[{:foo 1} {:value [{:bar 2}]}] [{:value [{:bar 2}]}] nil]
;; => difform output
[{:
- foo 1} {:
value [{:bar 2}]}]
;; => nil
答案 3 :(得分:0)
Differ是一个最近的图书馆,似乎做得很好:
(def person-map {:name "Robin"
:age 25
:sex :male
:phone {:home 99999999
:work 12121212})
(def person-diff (differ/diff person-map {:name "Robin Heggelund Hansen"
:age 26
:phone {:home 99999999})
;; person-diff will now be [{:name "Robin Heggelund Hansen"
;; :age 26}
;; {:sex 0
;; :phone {:work 0}]
已编辑:修复从gitlab更改为GitHub的差异repo URL
答案 4 :(得分:0)