Не цитируйте список. Макросы не оценивают свои аргументы, поэтому вам не нужно заключать их в кавычки, чтобы предотвратить их оценку, как вы делаете для обычных функций.
(gen ("foo" "bar"))
Когда вы цитируете это, вы выполняете
(get (quote ("foo" "bar")))
Значение str-list
- это список (quote ("foo" "bar"))
, поэтому (car str-list)
- это символ QUOTE
. В результате макрос расширяется до
(defun quote () (print "foo"))
Вот почему вы получаете сообщение об ошибке, в котором говорится, что вы пытаетесь переопределить встроенный QUOTE
.
Разница во втором примере в том, что вы просто подставляете параметр в расширение, а не используете его значение в коде расширения. Таким образом, он расширяется до
(mapc #'(lambda (str) (print str)) '("foo" "bar")))
Здесь список будет использоваться при запуске расширения, а не при расширении макроса. Его нужно заключить в кавычки, чтобы он не оценивался как вызов функции.
Вы должны использовать macroexpand
, чтобы увидеть, как ваши макросы расширяются при отладке.