Macros 如何编写Clojure宏来创建多个表达式?

Macros 如何编写Clojure宏来创建多个表达式?,macros,clojure,Macros,Clojure,是否可以在Clojure中编写生成多个值或表达式的宏? 对我来说,这似乎是不可能的,至少通过使用语法引号模板“(..)是不可能的 e、 g.从:[14]通过[1(mr 23)4]到[1234] 或来自: (do (prn 1) (prn 4)) 通过: 致: 宏将一个窗体扩展为另一个窗体,因此不能让宏返回两个完全独立的窗体。但是,您可以让它返回复合形式,如执行一系列操作的do语句 (defmacro foo [n] `(do ~@(map #(list println %) n))

是否可以在Clojure中编写生成多个值或表达式的宏? 对我来说,这似乎是不可能的,至少通过使用语法引号模板“(..)是不可能的

e、 g.从:
[14]
通过
[1(mr 23)4]
[1234]

或来自:

(do
  (prn 1)
  (prn 4))
通过:

致:


宏将一个窗体扩展为另一个窗体,因此不能让宏返回两个完全独立的窗体。但是,您可以让它返回复合形式,如执行一系列操作的
do
语句

(defmacro foo [n]
  `(do ~@(map #(list println %) n)))
对于上面的示例,您可以在要修改的表单周围放置宏:

(expand-mr
 (do 
   (prn 1)
   (mr 2 3)
   (prn 4)))

宏被设计为安全的,因此它们不能修改自己范围之外的任何内容。当前,宏获取一个s表达式,并将其更改为另一个更有用或更有用的s表达式。为了使宏返回两个单独的s表达式,它必须修改其封闭表达式。语法必须完全不同,我不清楚如何使用s表达式实现这一点。解决方法是扩大宏的范围,包括需要修改的所有内容。

谢谢Arthur!我已经在期待这个答案了,但很高兴能确定。但是你能给我一个例子,一个宏返回两个独立的表单会导致安全问题,但在其他情况下是安全的吗?我认为范围还是一样的。我用的是“安全”这个词,对此表示歉意。我将对其进行编辑以进行扩展。
(defmacro foo [n]
  `(do ~@(map #(list println %) n)))
(expand-mr
 (do 
   (prn 1)
   (mr 2 3)
   (prn 4)))