Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macros 生成一组使用编译时安全数据的宏_Macros_Clojure - Fatal编程技术网

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,我想时间到了我会用一个自我回答来结束这个。对不起大家,谢谢你们的帮助!