Macros 在宏之间传递状态

Macros 在宏之间传递状态,macros,clojure,Macros,Clojure,在Clojure中创建一组在编译时彼此共享信息的宏的最佳方法是什么 我正在寻找一些方法,让宏知道以前的宏做了什么,并相应地采取行动,例如,如何实现可以像下面这样使用的宏: (macro-block-with-data ["A" "B" "C"] (process-next-data-item) ; macro expands using "A" (process-next-data-item) ; macro expands using "B" (process-n

在Clojure中创建一组在编译时彼此共享信息的宏的最佳方法是什么

我正在寻找一些方法,让宏知道以前的宏做了什么,并相应地采取行动,例如,如何实现可以像下面这样使用的宏:

(macro-block-with-data ["A" "B" "C"]
   (process-next-data-item)    ; macro expands using "A"
   (process-next-data-item)    ; macro expands using "B"
   (process-next-data-item))   ; macro expands using "C"
澄清

  • 这需要在编译时使用宏实现,即在运行时不使用常规函数

它是词汇范围吗?如果是这样,您可以执行如下操作,使用有状态迭代器(尽管有点难看)

例如:

(defn test []
  (macro-block-with-data ["A" "B" "C"]
    (println "start")
    (process-next-data-item)    ; macro expands using "A"
    (println "middle")
    (process-next-data-item)    ; macro expands using "B"
    (println "almost done")
    (macro-block-with-data [ "NestedA" "NestedB" ]
      (println "starting nested")
      (process-next-data-item)
      (process-next-data-item)
      (println "done nested"))
    (process-next-data-item)
    (println "done")))
。。。结果

user> (test)
start
step A
middle
step B
almost done
starting nested
step NestedA
step NestedB
done nested
step C
done
nil

它是词汇范围的吗?如果是这样,您可以执行如下操作,使用有状态迭代器(尽管有点难看)

例如:

(defn test []
  (macro-block-with-data ["A" "B" "C"]
    (println "start")
    (process-next-data-item)    ; macro expands using "A"
    (println "middle")
    (process-next-data-item)    ; macro expands using "B"
    (println "almost done")
    (macro-block-with-data [ "NestedA" "NestedB" ]
      (println "starting nested")
      (process-next-data-item)
      (process-next-data-item)
      (println "done nested"))
    (process-next-data-item)
    (println "done")))
。。。结果

user> (test)
start
step A
middle
step B
almost done
starting nested
step NestedA
step NestedB
done nested
step C
done
nil

我可能不太理解这个问题。正如我所读到的,您似乎想要
(映射处理下一个数据项[“A”“B”“C]”)
。因此,如果不是,也许你可以澄清一点。@kwbeam-不符合要求,因为a)它需要在编译时,b)一般来说,代码不会是简单的映射操作,因为在每个进程下一个数据项调用和c)数据可能是任何东西之间可能有很多其他代码(例如,宏被展开的次数计数器)而不仅仅是一个序列。我可能不太理解这个问题。在我阅读时,你似乎想
(映射处理下一个数据项[“a”“B”“C]”)
。因此,如果不想,也许你可以澄清一点。@kwbeam-不符合要求,因为a)它需要在编译时进行,b)一般来说,代码不会是一个简单的映射操作,因为在每个进程下一个数据项调用和c)数据可能是任何东西(例如,宏被展开的次数计数器),而不仅仅是一个序列。