在表单的任何子表单上运行转换,该表单是对clojure.zip中函数的调用

时间:2013-08-30 06:28:51

标签: macros clojure clojurescript

嗯,标题是满口的,所以我会扩展它。我有以下代码(它不完整,主要仅用于说明):

(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个位置(locdownrightrightupdate运行转换)因为这些都是clojure.zip内的所有功能。

  

(gozip(let [d(down loc)](node loc)))

在上面的表达式中,我想在2个地方(downnode)运行变换。

对于解释我感兴趣的东西如此迂腐感到抱歉,只是因为我无法解释我想要的东西,通过示例看起来更容易。我希望在clojure和clojurescript代码中使用gozip。

0 个答案:

没有答案