为啥这个 Common Lisp 宏不起作用?书上的答题卡错了吗?

Posted

技术标签:

【中文标题】为啥这个 Common Lisp 宏不起作用?书上的答题卡错了吗?【英文标题】:Why this Common Lisp macro does not work? Is the answer sheet from the book wrong?为什么这个 Common Lisp 宏不起作用?书上的答题卡错了吗? 【发布时间】:2021-10-22 07:19:18 【问题描述】:

我正在尝试通过Common Lisp:符号计算的简单介绍这本书来学习Common Lisp。此外,我正在使用 SBCL、Emacs 和 Slime。

在第 14 章,最后一章,作者介绍了宏。出现以下问题:

编写一个名为 VARIABLE-CHAIN 的宏,它接受任意数量的 输入。表达式(VARIABLE-CHAIN A B C D) 应该扩展为 将A 设置为’BB 设置为’C 并将C 设置为’D 的表达式。

答题卡是:

从pdf复制并粘贴到这里:

(defmacro variable-chain (&rest vars)
 ‘(progn 
    ,@(do ((v vars (rest v))
           (res nil))
          ((null (rest v)) (reverse res))
        (push ‘(setf ,(first v) ’,(second v))
               res))))

在 Emacs 中,我使用了 hack 来删除智能引号。将它粘贴到 Emacs 中,我得到:

(defmacro variable-chain (&rest vars)
  '(progn
     ,@(do ((v vars (rest v))
            (res nil))
           ((null (rest v)) (reverse res))
         (push '(setf ,(first v)
                      ',(second v))
                res))))

很遗憾,我无法将其编译为 Slime 的 REPL,它会引发错误:

> READ error during COMPILE-FILE: Comma not inside a backquote.

我尝试将'(progn 更改为:

`(progn

但它也不起作用:"comma not inside a backquote"

我做错了吗?还是答题卡不对?

谢谢。

【问题讨论】:

@Rob 证明张贴的图片在这里是必不可少的。不在这里发布它会使问题变得不清楚。其张贴无法避免,不应受到处罚。 :) @Rob 请重新阅读我的评论。 :) 图像 很重要。图片这里的(基本部分)问题。 PDF 被正确看到,文本被复制出一些非 ASCII 字符,然后被一些外部不正确地处理。 @Rob 我已经在上面扩展了我的评论,但您也可以更仔细地阅读问题和答案,以获得完整和正确的观点。如果它只是由人类重新输入,谁能说他们没有在那里引入其他异常? @Rob 除非问题与图片有关。 @Rob 图片还在问题中吗?是的,因为它是固有的。以及两个文本代码 sn-ps。 【参考方案1】:

您还需要更改另一个:

(defmacro variable-chain (&rest vars)
  `(progn
 ;; this one you did change
     ,@(do ((v vars (rest v))
            (res nil))
           ((null (rest v)) (reverse res))
         (push `(setf ,(first v)
           ;; ^^^ also need to change this one
                      ',(second v))
                res))))

是反引号,而 是常规引号,但是您的“hack”错误地将它们都变成了常规引号 ' 字符:

(defmacro variable-chain (&rest vars)
 ‘(progn 
 ;; backquote
    ,@(do ((v vars (rest v))
           (res nil))
          ((null (rest v)) (reverse res))
        (push ‘(setf ,(first v) ’,(second v))
          ;; backquote         quote
               res))))

【讨论】:

实际上,您在图像中正确地看到了它们。正是从 pdf 中复制将它们生成为非 ASCII 字符,以及引入错误的“hack”翻译。 谢谢你,@Will。有一个疑问,作为一个更有经验的 lisp,你有更好的技巧来处理从 pdf 复制 lisp 代码吗?只是使用常识

以上是关于为啥这个 Common Lisp 宏不起作用?书上的答题卡错了吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的简单 C 宏不起作用?

Common lisp——为啥这个符号不是外部的?

为 UIFont 定义宏不起作用

Word 2010 宏不起作用

如何在 VS 2010 中出现第一个错误时停止 C# 编译(VS 2008 宏不起作用)!

保存excel文件后运行宏不起作用