生成一组消耗编译时安全数据的宏

时间:2015-02-19 09:04:16

标签: macros clojure

我想使用multiple-statements来生成放在generate中的代码。我使用两个宏和一个调用函数,因为我认为我需要解决调用存储。理想情况下,do已消失,而generate只是包含' multiple-statements生成的代码。最终它与Hiccup的作用相差太远,但我无法解释打嗝是如何使用可能不以文字形式提供的数据的。

(ns testprojclj.repromacro)

(defn store []
  (identity {:a 1 :b 2 :c 2}))

(defn multiple-statements [val]
  `(do 
     (println "some other logic or statement")
     (println (map? ~val))
     (println (str "type of arg is " (type ~val)))))

(defmacro generate [val]
  (multiple-statements val))

(defn somefn []
  (generate (store)))

编辑:我希望将类型识别为地图。相反,当我尝试不同的转义场景时,它不会编译或生成转义输出而不是工作函数调用。

1 个答案:

答案 0 :(得分:0)

至少(至少对我来说)不清楚你想做什么以及为什么你需要一个宏。由于宏在编译时发生,我不确定你的意思是'消耗编译时安全数据'。在我看来,只需一个返回函数的函数就可以达到你想要的效果。如果你想要的是一个关闭一个值的函数,这里有一个如何完成的例子。

(defn store []
  (identity {:a 1 :b 2 :c 2}))

(defn multiple-statements [val]
  (fn []
    (println "Some other logic or statements")
    (println (map? val))
    (println (str "Type of arg is " (type val)))))

(defn generate [val]
  (multiple-statements val))

(def stmts (generate (store)))

然后你就可以了

so.core> (stmts)
Some other logic or statements
true
Type of arg is class clojure.lang.PersistentArrayMap
nil