LINUX.ORG.RU

Вопрос про гигиенические макросы

 ,


2

3

Реализация у меня - guile. Мне интересен аналог вот такого гипотетического макроса на CL:

(defmacro define-handler (name
                          ;; далее идут опции кодогенерации
                          ;; обычно это так называемый plist
                          ;; где значения у ключей это символы, T, NIL
                          (&rest code-options)
                          &body code)
  (let ((binds
          ;; тут довольно сложная обработка опций, где я частенько пользуюсь
          ;; и CLOS
          (handle-code-options code-options)))
    `(let ;; тут let чисто для компактности, хотя результат обработки опций
         ;; может потребовать подключения let*, flet и прочего с приличным
         ;; количеством генерируемого кода
         ,(handle-code-options code-options)
       ,@code)))

Какие формы надо изучать, чтобы писать такое на гигиенических макросах?

★★★★★

Какие формы надо изучать, чтобы писать такое на гигиенических макросах?

syntax-case

(define-syntax define-handler
  (lambda (x)
    (syntax-case x ()
      ((_ name (code-options ...) code ...)
       (with-syntax ((binds (datum->syntax x (handle-code-options #'(code-options ...))))
         #'(let binds code ...))))))
monk ★★★★★ ()
Последнее исправление: monk (всего исправлений: 1)