【发布时间】:2013-02-21 20:47:48
【问题描述】:
我想知道如何在 Clojure 中,如果传入 符号名称 和 向量,来替换所述项目。 p>
例如,我想替换以下任何实例:
[:not :symbolName]
与
(not symbolName)
所以:
[ [:p] [:not :q] [:not :r] [r] ]
会变成:
[ [:p] (not q) (not r) [r] ]
任何帮助都将非常感激,提前致谢^_^
【问题讨论】:
我想知道如何在 Clojure 中,如果传入 符号名称 和 向量,来替换所述项目。 p>
例如,我想替换以下任何实例:
[:not :symbolName]
与
(not symbolName)
所以:
[ [:p] [:not :q] [:not :r] [r] ]
会变成:
[ [:p] (not q) (not r) [r] ]
任何帮助都将非常感激,提前致谢^_^
【问题讨论】:
这是漂亮通用的。
(defn sym-replace [[x y] & syms]
(cond
(and x y (some #{x} syms)) (list (-> x name symbol) (-> y name symbol))
(and x y) [x y]
:else [x]))
例子:
(def my-vec [[:p] [:not :q] [:not :r] ['r] [:foo :bar]])
(map #(sym-replace % :not) my-vec)
;; ([:p] (not q) (not r) [r] [:foo :bar])
(map #(sym-replace % :foo) my-vec)
;; ([:p] [:not :q] [:not :r] [r] (foo bar))
(map #(sym-replace % :not :foo) my-vec)
;; ([:p] (not q) (not r) [r] (foo bar))
【讨论】:
(use '[clojure.walk :only (prewalk)])
(defn match? [x]
(and (vector? x)
(= (first x) :not)
(keyword? (second x))))
(defn transform [x]
(map (comp symbol name) x))
(defn replac [p t x]
(prewalk #(if (p %) (t %) %) x))
(replac match? transform [[:p] [:not :q] [:not :r] '[r]])
=> [[:p] (not q) (not r) [r]]
【讨论】: