のための無限再帰をprewalk結合がベクトルの4番目の項目になることを確認してください。しかし、:list/items
のすべてのインスタンスを(default :list/items [])
に置き換える必要があります。Clojureのはdatomicクエリ
私がこれを行うために知っている唯一の方法は、clojure.walk/prewalk
を使用することです。しかし、それは無限再帰につながる:徒歩:list/items
を見つけて'(default :list/items [])
に置き換えたら
(clojure.walk/prewalk #(if (= :list/items %)
'(default :list/items [])
%)
query)
、それはその後、置き換え値で:list/items
を見つけ、それを置き換えます。そういうことなど。
原子を使用して、値が1回だけ置換されることを確認できますが、不正行為のように感じます。
他の方法はありますか?あなたはおそらくpostwalkを使用する必要があり、この場合の
ああ、postwalk-replaceは完璧です。好奇心から、プレウォークを使用してクエリを操作する必要があるとしましょう。置換を追跡するためにアトムを使用する必要がありますか?それとも別の方法がありますか? – egracer
どういう意味ですか?ちょうど今それを考えることができません) – leetwinski
しかし、私はあなたのためにそれのための 'ジッパー 'を見てお勧めします。ツリー上での置換と反復の細かい制御が必要な場合。例えば、いくつかのアイテムを置き換えて、このアイテムをスキップしたり、いくつかのアキュムレータでそれを追跡したりすることができます(ジッパーは 'loop/recur'でうまく動作するので – leetwinski