首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重写这个Common宏,避免使用回引号?

如何重写这个Common宏,避免使用回引号?
EN

Stack Overflow用户
提问于 2022-03-30 18:25:04
回答 2查看 75关注 0票数 0

我正试着用“通用Lisp:符号计算的温柔入门”一书来学习Common。此外,我正在使用SBCL,Emacs,和泥。

在最后一章中,作者给出了在宏上重写内置incf宏的实例.他用两种不同的方法教授这个概念:使用后引号和不使用它。例如:

代码语言:javascript
复制
(defmacro list-notation-my-incf (x)
  (list 'setq x (list '+ x 1)))

(defmacro backquote-notation-my-incf (x)
  `(setq ,x (+ ,x 1)))

稍后,作者介绍了另一个示例:

在下面的示例中,

是一个以函数名和另一个对象作为参数的宏;它用两个参数扩展为对函数的调用,这两个参数都是引用的对象。

他只会用回引角色来做:

代码语言:javascript
复制
(defmacro two-from-one (func object)
  `(,func ',object ',object))

它如预期的那样工作:

代码语言:javascript
复制
CL-USER> (two-from-one cons stack-overflow)
(STACK-OVERFLOW . STACK-OVERFLOW)

使用slime-macroexpad-1,我有:

代码语言:javascript
复制
(CONS 'STACK-OVERFLOW 'STACK-OVERFLOW)

作为为自己创建的的一个练习,我试着做同样的事情,但避免使用回引号。不幸的是,我无法使它发挥作用:

代码语言:javascript
复制
(defmacro list-two-from-one (func object)
  (list func (quote object) (quote object)))

黏液抛出错误:

代码语言:javascript
复制
The variable OBJECT is unbound.
   [Condition of type UNBOUND-VARIABLE]

做一个宏观扩张,我看到:

代码语言:javascript
复制
(CONS OBJECT OBJECT)

如果我尝试一种不同的方法,它似乎更接近,但也不起作用:

代码语言:javascript
复制
(defmacro list-two-from-one (func object)
  (list func object object))

抛出错误:

代码语言:javascript
复制
The variable STACK-OVERFLOW is unbound.
   [Condition of type UNBOUND-VARIABLE]

最后,宏观扩展表明:

代码语言:javascript
复制
(CONS STACK-OVERFLOW STACK-OVERFLOW)

我觉得卡住了。如何成功地重写宏而不使用反向引号?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-30 18:44:56

你要找的东西就像

代码语言:javascript
复制
(defmacro list-two-from-one (func object)
  (list func (list 'quote object) (list 'quote object)))

基本上,宏的主体应该返回代码,当对代码进行评估时,就会产生所需的结果。

也就是说,宏体应该产生(CONS 'STACK-OVERFLOW 'STACK-OVERFLOW)

由于'a(quote a)相同,所以您希望您的宏生成

代码语言:javascript
复制
(CONS (QUOTE STACK-OVERFLOW) (QUOTE STACK-OVERFLOW))

这就是我上面的defmacro返回的内容。

票数 3
EN

Stack Overflow用户

发布于 2022-03-30 18:44:18

您的宏应该扩展到:

代码语言:javascript
复制
CL-USER 10 > (macroexpand '(two-from-one2 cons stack-overflow))
(CONS (QUOTE STACK-OVERFLOW) (QUOTE STACK-OVERFLOW))

因此,使用这样的quote创建列表:

代码语言:javascript
复制
(defmacro two-from-one2 (func object)
  (list func (list 'quote object) (list 'quote object)))

测试:

代码语言:javascript
复制
CL-USER 9 > (two-from-one2 cons stack-overflow)
(STACK-OVERFLOW . STACK-OVERFLOW)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71682294

复制
相关文章

相似问题

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