Macros 扩展为defsetf的Defmacro
我在CL中的一些嵌套反引号中遇到了一些问题。我正在尝试创建一个宏Macros 扩展为defsetf的Defmacro,macros,lisp,common-lisp,backticks,Macros,Lisp,Common Lisp,Backticks,我在CL中的一些嵌套反引号中遇到了一些问题。我正在尝试创建一个宏define access,该宏包含两个参数,F和a定义访问应为符号F定义一个函数和setf扩展,其作用与a的相应函数和setf类似。目前的代码如下 (defmacro define-access (F A) (let ((X (gensym)) (Y (gensym))) `(progn (defun ,F (,X) (,A ,X)) (defsetf ,F
define access
,该宏包含两个参数,F
和a
<代码>定义访问应为符号F
定义一个函数和setf扩展,其作用与a
的相应函数和setf类似。目前的代码如下
(defmacro define-access (F A)
(let ((X (gensym))
(Y (gensym)))
`(progn
(defun ,F (,X)
(,A ,X))
(defsetf ,F (,X) (,Y)
`(setf (,A ,,X) ,,Y)))))
(define-access fname car)
=> (progn (defun fname (x) (car x))
(defsetf fname (x) (y) `(setf (first ,x) ,y)))
问题出现在底部,带有嵌套的反引号
define access
的预期行为如下所示
(defmacro define-access (F A)
(let ((X (gensym))
(Y (gensym)))
`(progn
(defun ,F (,X)
(,A ,X))
(defsetf ,F (,X) (,Y)
`(setf (,A ,,X) ,,Y)))))
(define-access fname car)
=> (progn (defun fname (x) (car x))
(defsetf fname (x) (y) `(setf (first ,x) ,y)))
但是现在,根据macroexpand-1
,我得到了以下信息(为了保持理智,添加了换行符)
我对反引号运算符有什么不理解,或者我应该如何处理这类问题?在嵌套的反引号中,在
A
之前需要另一个逗号,因此它会扩展到外部反引号之外的变量值。然后需要引用它,以避免将其作为变量进行评估。所以它就变成了,”,一个
(defmacro define-access (F A)
(let ((X (gensym))
(Y (gensym)))
`(progn
(defun ,F (,X)
(,A ,X))
(defsetf ,F (,X) (,Y)
`(setf (,',A ,,X) ,,Y)))))
Hm。。。这似乎更接近我想要的,但是当我尝试使用
setf
扩展器时,我得到了“变量车没有价值”。解决这个问题。通过您的新编辑,它可以完美地工作。非常感谢。您知道define access
与defsetf
的缩写形式相同,对吗(defsetf fname car)
仅供参考,使用宏的方法是(定义访问fname car)
而不是(定义访问(fname car))
@Barmar对,对不起。修正了。幸运的是,扩展是正确的。@Barmar是吗?defsetf(据我所知)定义了在getter上使用setf时要调用的写函数,而不是同义词(即(defsetf car rplaca)
将定义接近car
的setf)对不起,你是对的。