我想知道如何在 Clojure 中提交符号名称和向量,以替换所述项目。
例如,我想替换以下任何实例:
[:not :symbolName]
与
(not symbolName)
所以:
[ [:p] [:not :q] [:not :r] [r] ]
会变成:
[ [:p] (not q) (not r) [r] ]
任何帮助都会非常赞赏,非常喜欢提前^ _ ^
答案 0 :(得分:0)
这是漂亮的通用。
(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))
答案 1 :(得分:0)
(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]]