Цитировать вызов макроса читателя
Есть ли способ процитировать вызов макроса читателя? Более конкретно, я хочу создать макрос, который после оценки будет генерировать оператор defclass и соответствующий XML-файл. Это возможно?
Я думал об использовании #.( ... )
макросы для чтения, но я предполагаю, что параметры макроса не предназначены для использования внутри макроса для чтения. Это правильно?
Поэтому моей второй мыслью было попытаться сгенерировать утверждение, включающее макросы читателя, но я не уверен, есть ли способ сделать это.
Любые предложения по созданию файлов XML при расширении вызова макроса?
Заранее спасибо за любые идеи.
2 ответа
Что-то вроде:
(defmacro def-wsdl-class (name (&rest supers)
(&rest slots)
&rest options)
`(progn
(eval-when (:compile-toplevel :execute)
(with-open-file (xml-file (make-pathname :name (string-capitalize name)
:type "wsdl"
:defaults (or *compile-pathname*
*load-pathname*))
:direction :output
:if-exists ,(getf options :if-wsdl-exists :error))
(when xml-file
(spit-xml xml-file ',name ',supers ',slots ,@options))))
`(defclass ,name (,@supers)
(,@slots)
,@(chew options)))))
РЕДАКТИРОВАТЬ: Чтобы ответить на ваш оригинальный вопрос, вы не можете (обратно) цитировать макросы читателя. Они выполняются прямо там, где читается синтаксис, назовем его "время чтения". Макросы считывателя не участвуют в обычном раскрытии макроса, они действуют до раскрытия макроса.
Возможно, вы могли бы создать макрос для чтения, который знает, что он вызывается внутри макроса для чтения обратных цитат, чтобы поиграть с ним, но для этого потребуется знание или изменение зависимого от реализации поведения макроса для чтения обратных цитат.
Однако вы можете возвращать формы с кавычками из макросов читателя.
"Макрос читателя" и "макрос" - совершенно разные звери, используемые для совершенно разных вещей.
"Макрос читателя" - это, как правило, функция для начала. Они связаны с одним (или определенной последовательностью из двух) символов и изменяют способ чтения исходного кода. Они не о коде, а о создании объекта.
Для "макроса читателя" не существует очевидного определения того, какими будут "параметры макроса" (кроме, возможно, последовательности символов (символов), которая вызывала макрос читателя во-первых, что полезно для пример, соответствовать (
к )
когда читаешь список).