如何从 Clojure 中的地图宏获取宏中的参数?

How do I get the argument in a macro from a map macro in Clojure?

我正在将我的宏传递给地图操作(这也是一个宏)。我在表达自己的价值观时遇到了一些麻烦。这是一个例子:

(def num-vec [1 2 3 4 5])

(defmacro describe-args [first-arg & remaining-args]
  `(println '~first-arg '~remaining-args))

(doall (map #(describe-args "my args " %) num-vec))

这个returns:

  my args  (p1__432#)
  my args  (p1__432#)
  my args  (p1__432#)
  my args  (p1__432#)
  my args  (p1__432#)

我的问题是:如何从 Clojure 中的映射宏获取宏中的参数?

(我认为这是一个不同于其他 map/macro 问题的问题,因为这是关于 参数检索 的。

您可以将宏 describe-args 更改为:

(defmacro describe-args [desc & args]
  `(println ~desc ~@args))

现在

(doall (map #(describe-args "my args " %) num-vec))

打印

my args  1
my args  2
my args  3
my args  4
my args  5

answer 中描述了更通用的调试宏。

不确定这是不是你想要的

(defmacro print-second [form]
  (if (list? form) 
     `(do (println '~(second form) " = " ~(second form)) ~form)
     form))

(def num-vec [1 2 3 4 5])

(doall (map #(print-second (+ (* 3 42) %)) num-vec))

=>

;(* 3 42)  =  126
;(* 3 42)  =  126
;(* 3 42)  =  126
;(* 3 42)  =  126
;(* 3 42)  =  126
(127 128 129 130 131)


(print-second (+ 99 7))

=>

;99  =  99
106

(print-second 3)

=>

3