Я пытаюсь написать макрос, который определяет некоторые помощники для структуры данных struct-of-arrays (на основе this snippet). Внутри этого макроса я определяю другой макрос, который помогает обойти все значения слотов в структуре. Дело в том, что я не могу заставить двойную кавычку работать должным образом. Вот код:
(defmacro defcomponent (name-and-options &body slots)
(setf name-and-options (ensure-list name-and-options))
(let ((struct (first name-and-options))
(slot-names (iter (for s in slots)
(collecting
(ematch s
((or (and name (symbol)
(<> _ '*)
(<> _ nil))
(list* name _ (plist :type _ :read-only _)))
name))))))
`(progn (defstruct ,name-and-options
;; some task-specific stuff omitted here
)
(defmacro ,(symbolicate 'with- struct) (components &rest body)
`(loop
,@',(iter (for s in slot-names)
(appending `(for ,s across (,(symbolicate struct '- s) components))))
do ,@body)))))
Например, (defcomponent buzz x y)
macroexpands к
(PROGN
(DEFSTRUCT (BUZZ)
X Y) ;; details omitted
(DEFMACRO WITH-BUZZ (COMPONENTS &REST BODY)
`(LOOP ,@'(FOR X ACROSS (BUZZ-X COMPONENTS) FOR Y ACROSS (BUZZ-Y COMPONENTS))
DO ,@BODY))
, который вроде работает, но я хочу получить доступ к параметру components
внутреннего макроса with-buzz
то есть что-то вроде этого
(DEFMACRO WITH-BUZZ (COMPONENTS &REST BODY)
`(LOOP FOR X ACROSS (BUZZ-X ,COMPONENTS) FOR Y ACROSS (BUZZ-Y ,COMPONENTS)
DO ,@BODY))
Как мне этого достичь? Я перепробовал множество комбинаций ,
и ,@
, но безрезультатно.