1

好吧,标题是满口的,所以我将对其进行扩展。我有以下代码(它不完整,主要是为了说明):

(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 个位置(locdownrightrightupdate)运行转换,因为这些都是clojure.zip.

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

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

很抱歉对解释我感兴趣的东西如此迂腐,只是我无法准确地解释我想要的东西,通过示例似乎更容易。我希望在 clojure 和 clojurescript 代码中使用 gozip。

4

0 回答 0