4

次のシーケンスを考えます。

seq = ( (a b) ( (c d) a ) a )
(replace a z seq) => ( (z b) ( (c d) z ) z )

遅延シーケンスと末尾再帰を使用してそれを行うにはどうすればよいですか?

4

1 に答える 1

5

データ構造をウォークスルーしたいようです。

user=> (def s '((:a :b)((:c :d) :a) :a))
#'user/s
user=> (use 'clojure.walk)
nil
user=> (prewalk #(if (= :a %1) :z %1) s)
((:z :b) ((:c :d) :z) :z)

編集:または、実際に交換するだけでよい場合は、より簡単に

user=> (prewalk-replace '{a z} '((a b) ((c d) a)))
((z b) ((c d) z))
于 2013-01-04T20:51:07.920 に答える