为啥这个 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
设置为’B
、B
设置为’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 宏不起作用?书上的答题卡错了吗?的主要内容,如果未能解决你的问题,请参考以下文章