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

时间:2015-02-16 10:55:55

标签: dictionary macros 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))

返回:

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

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

(我认为这是与已经提出的其他地图/宏问题不同的问题,因为这是关于参数检索)。

2 个答案:

答案 0 :(得分:2)

您可以将宏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中描述了更常用的调试宏。

答案 1 :(得分:0)

不确定这是否是你想要的

(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