【问题标题】:How do I get the argument in a macro from a map macro in Clojure?如何从 Clojure 中的映射宏中获取宏中的参数?
【发布时间】:2015-02-16 10:55:55
【问题描述】:

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

(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 中的 map 宏中获取宏中的参数?

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

【问题讨论】:

    标签: dictionary macros clojure


    【解决方案1】:

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

    【讨论】:

    • '~desc - 这里不需要'(引用)。它正在扩展到(quote "my args ")
    • 谢谢,已解决。
    【解决方案2】:

    不确定这是不是你想要的

    (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
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-07
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 2015-11-16
    相关资源
    最近更新 更多