Макрос: Как вывести запятую в сгенерированном коде с кавычками? - PullRequest
2 голосов
/ 03 мая 2019

У меня есть макрос вида:

;; Macro wich does a sort of defun for instance, with some other stuff.
(defmacro def2 (name (&rest args) &body body)
  `(defun ,(intern (string-upcase name)) (,@args)
     ,@body))

И я хочу сгенерировать лот def2:

(defmacro defdefs ()
  `(progn
     ,@(loop for name in '("name1" "name2" "name3")
         collect `(def2 ,name (&rest args)
            (print ,@args))))) ; <---- HERE.

Я хочу сослаться на args вформа def2, но если я напишу ,@args, она будет ссылаться на переменную (не определенную) в макросе defdefs.Я подумал использовать что-то вроде macro-function и apply, но есть ли лучший способ сообщить defdefs, что я хочу вывести этот список: (print ,@args) без оценки части ,@args во время макроразложения?

Я пытался играть с кавычками, двойными кавычками, обратными кавычками и двойными кавычками, но не могу найти решение ...

Заранее спасибо.

1 Ответ

4 голосов
/ 03 мая 2019
CL-USER 33 > (defmacro def2 (name (&rest args) &body body)
               `(defun ,(intern (string-upcase name)) (,@args)
                  ,@body))
DEF2

CL-USER 34 > (defmacro defdefs ()
               `(progn
                  ,@(loop for name in '("name1" "name2" "name3")
                          collect `(def2 ,name (&rest args)
                                     (print args)))))
DEFDEFS

CL-USER 35 > (pprint (macroexpand '(defdefs)))

(PROGN
  (DEF2 "name1" (&REST ARGS) (PRINT ARGS))
  (DEF2 "name2" (&REST ARGS) (PRINT ARGS))
  (DEF2 "name3" (&REST ARGS) (PRINT ARGS)))

CL-USER 36 > (pprint (macroexpand-1 '(DEF2 "name1" (&REST ARGS) (PRINT ARGS))))

(DEFUN NAME1 (&REST ARGS)
  (PRINT ARGS))
...