Во-первых, обратите внимание, что
`(concat ,(symbol-name a))
и
(list (quote concat) (symbol-name a))
делают одно и то же.Они являются эквивалентными частями кода (синтаксис обратной цитаты не ограничен телами макросов!): Оба создают список, первым элементом которого является символ CONCAT
, а вторым элементом является имя символа любой переменной, на которую ссылается A
.
Понятно, что это имеет смысл, только если A
относится к символу, который, как указал Сванте, не так в примере с вызовом макроса.
You может, конечно, извлечь символ из списка (QUOTE FOO)
, но это не позволяет вам вызывать макрос следующим образом:
(let ((x 'foo))
(tm x))
, что поднимает вопрос о том, почему вы хотите вызвать событиепользователь макроса явно указывает на кавычки символ, где он должен быть в любом случае литеральной константой.
Во-вторых, макрос работает следующим образом: они принимают фрагменты кода (например, (QUOTE FOO)
) в качестве аргументов исоздать новый фрагмент кода, который после макроразложения (более или менее) заменяет вызов макроса в исходном коде.Часто полезно повторно использовать аргументы макроса в сгенерированном коде, помещая их туда, где они будут оцениваться позже, например, в
(defmacro tm2 (a)
`(print (symbol-name ,a)))
Подумайте о том, что делает этот фрагмент кода и является ли мой let
пример выше работает сейчас.Это должно привести вас на правильный путь.
Наконец, совет: избегайте макросов, когда функция будет работать.Это значительно облегчит жизнь как исполнителю, так и пользователю.