【问题标题】:Clojure generic "replace" function for vectors向量的 Clojure 通用“替换”函数
【发布时间】:2013-02-21 20:47:48
【问题描述】:

我想知道如何在 Clojure 中,如果传入 符号名称向量,来替换所述项目。 p>

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

[:not :symbolName]

(not symbolName)

所以:

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

会变成:

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

任何帮助都将非常感激,提前致谢^_^

【问题讨论】:

    标签: vector clojure replace


    【解决方案1】:

    这是漂亮通用的。

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

    【讨论】:

      【解决方案2】:
      (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]]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-03
        • 1970-01-01
        • 2013-02-22
        • 2011-03-15
        • 2017-04-17
        相关资源
        最近更新 更多