扩展为 defsetf 的 Defmacro
Defmacro that expands to defsetf
我在处理 CL 中的一些嵌套反引号时遇到了一些问题。我正在尝试创建一个带有两个参数的宏 define-access
,F
和 A
。 define-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)))))
我在处理 CL 中的一些嵌套反引号时遇到了一些问题。我正在尝试创建一个带有两个参数的宏 define-access
,F
和 A
。 define-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)))))