Захват макросов в схеме

Какие's самый простой способ определить макрос захвата, используяdefine-syntax или жеdefine-syntax-rule в ракетку?

В качестве конкретного примера, здесьс тривиальнымaif в макросистеме в стиле CL.

(defmacro aif (test if-true &optional if-false)
    `(let ((it ,test))
        (if it ,if-true ,if-false)))

Идея в том, чтоit будет связан с результатомtest вif-true а такжеif-false статьи. Наивная транслитерация (минус необязательная альтернатива)

(define-syntax-rule (aif test if-true if-false)
    (let ((it test))
       (if it if-true if-false)))

который оценивает без жалоб, но ошибки, если вы пытаетесь использоватьit в пунктах:

> (aif "Something" (displayln it) (displayln "Nope")))
reference to undefined identifier: it

anaphora яйцо инвентарьaif как

(define-syntax aif
  (ir-macro-transformer
   (lambda (form inject compare?)
     (let ((it (inject 'it)))
       (let ((test (cadr form))
         (consequent (caddr form))
         (alternative (cdddr form)))
     (if (null? alternative)
         `(let ((,it ,test))
        (if ,it ,consequent))
         `(let ((,it ,test))
        (if ,it ,consequent ,(car alternative)))))))))

но ракетка некажется,ir-macro-transformer определено или задокументировано.

Ответы на вопрос(3)

Ваш ответ на вопрос