我需要動態地修改這個結構的數據:Clojure的prewalk無限遞歸查詢datomic
[:db/id
:list/title
:list/type
{:list/items [... lots of nested data ...]}]
以下幾點:
[:db/id
:list/title
:list/type
{(default :list/items []) [... lots of nested data ...]}]
由於我處理幾個不同的查詢,我可以確保連接將成爲向量中的第四項。但我需要用(default :list/items [])
替換:list/items
的每個實例。
我知道這樣做的唯一方法是使用clojure.walk/prewalk
。但是,它會導致無限遞歸:
(clojure.walk/prewalk #(if (= :list/items %)
'(default :list/items [])
%)
query)
一旦發現步行和:list/items
與'(default :list/items [])
替換它,然後它發現在更換價值:list/items
,並替換。等等等等。
我可以使用一個原子來確保值只被替換一次,但這就像作弊。
還有其他方法嗎?
在這種情況下,你可能需要使用
哦,很好,postwalk替換是完美的。出於好奇,假設我需要使用prewalk來以其他方式操縱查詢。我需要使用原子來跟蹤替換嗎?或者有其他方法嗎? – egracer
你的意思是什麼?現在想不出來) – leetwinski
但我建議你看看'拉鍊'。如果你想對樹上的替換和迭代進行細粒度的控制。例如,它可以讓你替換一些項目,然後跳過這個項目,或者在一些累加器中跟蹤它(因爲拉鍊與'loop/recur'很好地配合工作。 – leetwinski