扩展为 defsetf 的 Defmacro

Defmacro that expands to defsetf

我在处理 CL 中的一些嵌套反引号时遇到了一些问题。我正在尝试创建一个带有两个参数的宏 define-accessFAdefine-access 应该为符号 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 的预期行为如下。

(define-access fname car)
=> (progn (defun fname (x) (car x))
          (defsetf fname (x) (y) `(setf (first ,x) ,y)))

但是现在,根据 macroexpand-1,我得到了以下信息(为理智添加了换行符)。

(PROGN (DEFUN FNAME (#:G22490) (CAR #:G22490))
       (DEFSETF FNAME (#:G22490) (#:G22491)
           (LIST 'SETF (LIST A #:G22490) #:G22491)))

我对反引号运算符有什么不理解的,或者我应该如何处理这类问题?

嵌套反引号中的 A 之前需要另一个逗号,因此它会扩展到外部反引号之外的变量值。然后需要引用它以防止将其评估为变量。所以就变成了,',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)))))

DEMO