У меня проблемы с вложенными обратными кавычками в CL. Я пытаюсь создать макрос define-access
, который принимает два параметра: F
и A
. define-access
должен определять функцию и расширение setf для символа F
, которое действует так же, как соответствующая функция и setf для 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)))))
Проблема возникает внизу, с вложенной обратной кавычкой.
Желаемое поведение 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)))
Что я не понимаю в операторе обратной кавычки, или как мне подойти к подобной проблеме?
define-access
идентично сокращенной формеdefsetf
, верно?(defsetf fname car)
- person Barmar   schedule 31.01.2015(define-access fname car)
, а не(define-access (fname car))
- person Barmar   schedule 31.01.2015(defsetf car rplaca)
будет определять что-то близкое к setfcar
) - person Silvio Mayolo   schedule 31.01.2015