如何从 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
我正在将我的宏传递给地图操作(这也是一个宏)。我在表达自己的价值观时遇到了一些麻烦。这是一个例子:
(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