如何替换clojure中嵌套列表中的所有引用

如何替换clojure中嵌套列表中的所有引用,clojure,Clojure,按照以下顺序: seq = ( (a b) ( (c d) a ) a ) (replace a z seq) => ( (z b) ( (c d) z ) z ) 如何使用惰性序列和尾部递归来实现这一点?看起来您想要遍历一个数据结构 user=> (def s '((:a :b)((:c :d) :a) :a)) #'user/s user=> (use 'clojure.walk) nil user=> (prewalk #(if (= :a %1) :z %1)

按照以下顺序:

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

如何使用惰性序列和尾部递归来实现这一点?

看起来您想要遍历一个数据结构

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))