首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure宏参数

Clojure宏参数
EN

Stack Overflow用户
提问于 2013-01-18 20:15:24
回答 1查看 236关注 0票数 1

大约一周前,我在这个帖子中问了一个问题:Looping through a "let"-list in Clojure?我得到了一个很好的答案,然而,一个相当令人困惑的问题出现在我的脑海中:

以下是部分答案:

代码语言:javascript
复制
(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)语句是宏参数中的主体,对吗?所以我的印象是,它只是简单地“复制-粘贴”身体。因此,不是:

代码语言:javascript
复制
~@body

它将如下所示,然后它将取消引用复制的文本和所有这些内容:

代码语言:javascript
复制
~@(dorun (for [x (vals locals)] 
       (if (number? x) (println "roar"))))

在我试图解释所有正在发生的事情的过程中,我尝试了我刚才解释的事情。我尝试将一些“真正的代码”放在那里,而不是~@body。

然后它将看起来像这样:

代码语言:javascript
复制
(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……我个人的猜测是,由于我对如何组合这些奇怪的小符号缺乏充分的理解,所以我可能错过了它们的某种组合……

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-18 20:39:33

反引号表达式中的~@expr表示计算expr并将其拼接到周围的表达式中。

既然你不想评估你的(dorun ...)表达式,您可以直接复制并粘贴它:

代码语言:javascript
复制
(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

现在,你为什么要在这样的硬编码宏中引入用户指定的符号,我完全不知道。我猜这只是个实验。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14398757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档