好吧,标题是满口的,所以我将对其进行扩展。我有以下代码(它不完整,主要是为了说明):
(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))
should return之类的东西true
,任何不调用函数的形式都clojure.zip
应该 return false
。
我希望能够gozip
使用表单进行调用,并让对函数的每次调用都clojure.zip
被我的do-something-to-zip-form
转换所取代。一些例子:
(gozip(-> loc 右下角(clojure.zip/update 3))
在上面的表达式中,我希望它在 5 个位置(loc
、down
、right
、right
和update
)运行转换,因为这些都是clojure.zip
.
(gozip (let [d (down loc)] (node loc)))
在上面的表达式中,我想在 2 个地方 ( down
, node
) 运行转换。
很抱歉对解释我感兴趣的东西如此迂腐,只是我无法准确地解释我想要的东西,通过示例似乎更容易。我希望在 clojure 和 clojurescript 代码中使用 gozip。