1

さて、タイトルは一口ですので、それを拡張します。私は次のコードを持っています (これは不完全で、主に説明のためだけです):

(use '[clojure.zip :only [up down right node])

(defn in-zip? [form]
  (contains? (-> 'clojure.zip ns-publics vals set) (first form)))

(defn do-something-to-zip-form [fx loc rest]
  ;; this is where I would do the transform, but for now, I will just
  ;; return the actual form
  form)

(defn transform-zip [form]
  (if (in-zip? form)
    (do-something-to-zip-form form)
    form))

(defmacro gozip [body]
  (clojure.walk/postwalk transform-zip body))

の目的はin-zip?、フォームを取得し、評価されたフォームが の関数を呼び出すかどうかを判断することclojure.zipです。したがって、(is-zip? '(clojure.zip/down loc)orのようなもの(is-zip? '(up loc)) は を返す必要trueがあり、関数を呼び出していないフォームは をclojure.zip返す必要がありfalseます。

gozipフォームで呼び出して、関数へのすべての呼び出しを変換clojure.zipに置き換えたいと考えていdo-something-to-zip-formます。いくつかの例:

(gozip (-> loc down right right (clojure.zip/update 3))

loc上記の式では、5 つの場所 ( 、downrightrightおよび)で変換を実行したいと思います。updateこれらはすべて 内の関数だからclojure.zipです。

(gozip (let [d (down loc)] (ノード loc)))

down上記の式では、transform を 2 か所 ( 、 )で実行したいと考えていますnode

私が興味を持っていることを説明するのにとても衒学的で申し訳ありませんが、私が欲しいものを正確に説明するのに苦労しているだけです。clojure および clojurescript コードで gozip を使用しようとしています。

4

0 に答える 0