嗯,标题是满口的,所以我会扩展它。我有以下代码(它不完整,主要仅用于说明):
(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)
或(is-zip? '(up loc))
之类的内容应返回true
,任何未在clojure.zip
内调用函数的表单都应返回false
。
我希望能够使用表单致电gozip
,并将clojure.zip
中每个函数的调用替换为do-something-to-zip-form
转换。一些例子:
(gozip( - > loc right right right right(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。