Macros 在窗体的任何子窗体上运行转换,该窗体调用clojure.zip中的函数

Macros 在窗体的任何子窗体上运行转换,该窗体调用clojure.zip中的函数,macros,clojure,clojurescript,Macros,Clojure,Clojurescript,好吧,这个标题很有意思,所以我会详细介绍一下。我有以下代码(不完整,主要是为了说明): zip?中的目的是获取一个表单,并确定求值的表单是否调用clojure.zip中的函数。因此,类似于(is-zip?'(clojure.zip/down-loc)或(is-zip?'(up-loc))的内容应该返回true,任何未在clojure.zip中调用函数的表单都应该返回false 我希望能够使用表单调用gozip,并让对clojure.zip中的函数的每次调用都被我的对zip表单进行转换所取代。一些

好吧,这个标题很有意思,所以我会详细介绍一下。我有以下代码(不完整,主要是为了说明):

zip?中
的目的是获取一个表单,并确定求值的表单是否调用
clojure.zip中的函数。因此,类似于
(is-zip?'(clojure.zip/down-loc)
(is-zip?'(up-loc))
的内容应该返回
true
,任何未在
clojure.zip
中调用函数的表单都应该返回
false

我希望能够使用表单调用
gozip
,并让对
clojure.zip中的函数的每次调用都被我的
对zip表单进行转换所取代。一些示例:

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

在上面的表达式中,我希望它在5个位置运行转换(
loc
down
right
right
right
update
),因为这些都是
clojure.zip
中的函数

(gozip(让[d(下降位置)](节点位置)))

在上面的表达式中,我想在两个位置运行transform(
down
node


很抱歉,在解释我感兴趣的内容时太迂腐了,只是我很难准确地解释我想要什么,通过示例似乎更容易。我希望在clojure和clojurescript代码中使用gozip。

看起来您试图拦截对
clojure.zip
函数的调用以改变它们的行为-如果是这样,请查看Robert Hooke库:谢谢。我会看一看。我应该提到的是,我也希望在clojurescript下使用gozip,所以我添加了这一点。要想做你想做的事,我相信你需要一个代码行者。有关如何做到这一点的示例,请参阅。
(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))