Clojure向量的通用“替换”函数

时间:2013-02-21 20:47:48

标签: vector clojure replace

我想知道如何在 Clojure 中提交符号名称向量,以替换所述项目。

例如,我想替换以下任何实例:

[:not :symbolName]

(not symbolName)

所以:

[ [:p] [:not :q] [:not :r] [r] ]

会变成:

[ [:p] (not q) (not r) [r] ]

任何帮助都会非常赞赏,非常喜欢提前^ _ ^

2 个答案:

答案 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]]