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 为什么不是';这个clojure函数是否正在执行?_Macros_Clojure - Fatal编程技术网

Macros 为什么不是';这个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

我正在研究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-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
returns
nil
)被编译