Macros 为什么不是';这个clojure函数是否正在执行?
我正在研究braveclojure中的一些clojure示例: 目前我正在尝试执行此操作Macros 为什么不是';这个clojure函数是否正在执行?,macros,clojure,Macros,Clojure,我正在研究braveclojure中的一些clojure示例: 目前我正在尝试执行此操作 (ns turtle (:use clojure.pprint)) (def criticisms {:good "good code:" :bad "bad code:"}) (defn criticize-code [[critkey code]] `(println (~critkey criticisms) (quote ~code))) (defmacro code-cri
(ns turtle (:use clojure.pprint))
(def criticisms {:good "good code:" :bad "bad code:"})
(defn criticize-code
[[critkey code]]
`(println (~critkey criticisms) (quote ~code)))
(defmacro code-critic
[code-evaluations]
`(do ~@(map criticize-code code-evaluations)))
(println "executed code critic")
(code-critic {:good (+ 1 1) :bad (1 + 1)})
(println "code critic expansion")
(pprint (macroexpand '(code-critic {:good (+ 1 1) :bad (1 + 1)})))
;why isn't this executing?
(println "criticize code expansion")
(criticize-code [:good '(+ 1 1)])
基本上,我可以通过println
验证critic代码是否返回格式正确的代码;但我实际上无法执行……有人能告诉我我做错了什么吗
谢谢大家! 正在调用函数
critive code
。函数体中的准引号是syntax quote的读取器宏,这意味着在遍历syntax quote读取器之后,以下println
表单将作为数据结构返回,而不是执行。critic code
函数在语义上等同于
(定义代码)
[[critkey代码]]
(名单
'clojure.core/println
(列出关键人物/批评)
(列表“报价代码”))
如果要在REPL中将生成的数据结构视为代码,可以直接eval
turtle=>(批评代码[:good'(+11)])
(clojure.core/println(:好海龟/批评)(引用(+1)))
乌龟=>(评估(批评代码[:good'(+11)])
好代码:(+1)
无
那你为什么想要这样的函数呢?作为宏的助手,如这里的code-critic
。宏将代码作为数据处理为代码。因此,如果您在as data
阶段插入一个helper函数,它将需要将其结果作为数据返回。否则,您想要编译的代码只是在“编译”时执行,其返回值(println
returnsnil
)被编译