Erfassen von Makros im Schema

Was ist der einfachste Weg, um ein Capturing-Makro mit zu definierendefine-syntax oderdefine-syntax-rule im Schläger?

Als konkretes Beispiel sei hier das Triviale genanntaif in einem CL-ähnlichen Makrosystem.

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

Die Idee ist dasit wird an das Ergebnis von gebunden seintest in demif-true undif-false Klauseln. Die naive Transliteration (minus optionale Alternative) ist

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

das wertet ohne beschwerde aus, aber fehler wenn du versuchst zu benutzenit in den Klauseln:

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

Dasanaphora Ei implementiertaif wie

(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)))))))))

aber Schläger scheint nicht zu habenir-macro-transformer definiert oder dokumentiert.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage