大约一周前,我在这个帖子中问了一个问题:Looping through a "let"-list in Clojure?我得到了一个很好的答案,然而,一个相当令人困惑的问题出现在我的脑海中:
以下是部分答案:
(defmacro anaphoric-let [alternating-symbols-and-values & body]
`(let [~@alternating-symbols-and-values
names# (quote ~(flatten (partition 1 2 alternating-symbols-and-values)))
values# ~(vec (flatten (partition 1 2 alternating-symbols-and-values)))
~'locals (zipmap names# values#)]
~@body))
Input:
(anaphoric-let [a 1 b 2 c 3 d 4 e "cat"]
(dorun (for [x (vals locals)]
(if (number? x) (println "roar")))))本例中的(dorun)语句是宏参数中的主体,对吗?所以我的印象是,它只是简单地“复制-粘贴”身体。因此,不是:
~@body它将如下所示,然后它将取消引用复制的文本和所有这些内容:
~@(dorun (for [x (vals locals)]
(if (number? x) (println "roar"))))在我试图解释所有正在发生的事情的过程中,我尝试了我刚才解释的事情。我尝试将一些“真正的代码”放在那里,而不是~@body。
然后它将看起来像这样:
(defmacro anaphoric-let [alternating-symbols-and-values & body]
`(let [~@alternating-symbols-and-values
names# (quote ~(flatten (partition 1 2 alternating-symbols-and-values)))
values# ~(vec (flatten (partition 1 2 alternating-symbols-and-values)))
~'locals (zipmap names# values#)]
~@(dorun (for [x (vals locals)]
if (number? x) (println "roar"))))))这不起作用,并抱怨说“无法解析符号:在这种情况下的本地人”我在这方面是一个新手,我尝试过实验和分析,但我并没有变得更聪明。每次我想我都想通了,总会有这么点“但是...”它来了,把所有东西都压碎了!
我觉得我似乎对这个例子的其余部分有了一个像样的理解,除了邪恶的~@body……我个人的猜测是,由于我对如何组合这些奇怪的小符号缺乏充分的理解,所以我可能错过了它们的某种组合……
发布于 2013-01-18 20:39:33
反引号表达式中的~@expr表示计算expr并将其拼接到周围的表达式中。
既然你不想评估你的(dorun ...)表达式,您可以直接复制并粘贴它:
(defmacro anaphoric-let [alternating-symbols-and-values & body]
`(let [~@alternating-symbols-and-values
names# (quote ~(flatten (partition 1 2 alternating-symbols-and-values)))
values# ~(vec (flatten (partition 1 2 alternating-symbols-and-values)))
locals# (zipmap names# values#)]
(dorun (for [x (vals locals#)]
if (number? x) (println "roar"))))))由于您不再需要在正文中插入特定的符号,因此我将替换为的locals改为gensym'd symbol
现在,你为什么要在这样的硬编码宏中引入用户指定的符号,我完全不知道。我猜这只是个实验。
https://stackoverflow.com/questions/14398757
复制相似问题