さて、タイトルは一口ですので、それを拡張します。私は次のコードを持っています (これは不完全で、主に説明のためだけです):
(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 つの場所 ( 、down
、right
、right
および)で変換を実行したいと思います。update
これらはすべて 内の関数だからclojure.zip
です。
(gozip (let [d (down loc)] (ノード loc)))
down
上記の式では、transform を 2 か所 ( 、 )で実行したいと考えていますnode
。
私が興味を持っていることを説明するのにとても衒学的で申し訳ありませんが、私が欲しいものを正確に説明するのに苦労しているだけです。clojure および clojurescript コードで gozip を使用しようとしています。