Macros 生成一组使用编译时安全数据的宏
我想使用Macros 生成一组使用编译时安全数据的宏,macros,clojure,Macros,Clojure,我想使用多个语句生成放置在generate中的代码。我使用两个宏和一个调用函数,因为我认为我需要这样做,以便解决存储的调用。理想情况下,do不存在,而generate只是“包含”由多个语句生成的代码。说到底,这与Hiccup的功能相差不远,但我无法解释Hiccup是如何使用可能不作为文本提供的数据的 (ns testprojclj.repromacro) (defn store [] (identity {:a 1 :b 2 :c 2})) (defn multiple-statemen
多个语句
生成放置在generate中的代码。我使用两个宏和一个调用函数,因为我认为我需要这样做,以便解决存储的调用。理想情况下,do
不存在,而generate
只是“包含”由多个语句生成的代码。说到底,这与Hiccup的功能相差不远,但我无法解释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)))
编辑:我希望该类型被识别为映射。相反,当我尝试不同的转义场景时,它要么不编译,要么生成转义输出,而不是工作函数调用。不清楚(至少对我来说)您想要做什么以及为什么需要宏。由于宏发生在编译时,我不确定“使用编译时安全数据”是什么意思。在我看来,你只需要一个返回函数的函数就可以实现你想要的。如果您想要的是一个关闭某个值的函数,下面是一个如何实现的示例
(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
运行此代码时,您希望发生什么?它实际上生产什么?你知道吗?这将向您显示代码生成的内容。在post中更新。我使用macroexpand尝试了各种场景,但我无法获得它。我可以很好地生成普通宏,其中代码只是某种文本的模板。这种动态配置数据的变体是很困难的。上面的代码实际上可以工作。现在还不清楚你期望的结果是什么。你能提供你想要实现的结果的最终形式吗?我也能重现这似乎是可行的:user>(somefn)=>一些其他逻辑或语句,真的,arg的类型是class clojure.lang.PersistentArrayMap,nil
Great Caeser's Ghost。我想知道到底发生了什么事?在调试时,我会在同一个repl实例中反复重新计算宏或函数。也许这对宏不太管用,因为它昨晚根本不管用,但在我的工作公司,它工作得非常完美。Arg,我想时间到了我会用一个自我回答来结束这个。对不起大家,谢谢你们的帮助!