Macros 扩展为defsetf的Defmacro

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

我在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 (,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)对不起,你是对的。