Цитировать вызов макроса читателя

Есть ли способ процитировать вызов макроса читателя? Более конкретно, я хочу создать макрос, который после оценки будет генерировать оператор 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)))))

РЕДАКТИРОВАТЬ: Чтобы ответить на ваш оригинальный вопрос, вы не можете (обратно) цитировать макросы читателя. Они выполняются прямо там, где читается синтаксис, назовем его "время чтения". Макросы считывателя не участвуют в обычном раскрытии макроса, они действуют до раскрытия макроса.

Возможно, вы могли бы создать макрос для чтения, который знает, что он вызывается внутри макроса для чтения обратных цитат, чтобы поиграть с ним, но для этого потребуется знание или изменение зависимого от реализации поведения макроса для чтения обратных цитат.

Однако вы можете возвращать формы с кавычками из макросов читателя.

"Макрос читателя" и "макрос" - совершенно разные звери, используемые для совершенно разных вещей.

"Макрос читателя" - это, как правило, функция для начала. Они связаны с одним (или определенной последовательностью из двух) символов и изменяют способ чтения исходного кода. Они не о коде, а о создании объекта.

Для "макроса читателя" не существует очевидного определения того, какими будут "параметры макроса" (кроме, возможно, последовательности символов (символов), которая вызывала макрос читателя во-первых, что полезно для пример, соответствовать ( к ) когда читаешь список).

Другие вопросы по тегам