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.