Przechwytywanie makr w schemacie
Jaki jest najprostszy sposób zdefiniowania makra przechwytującegodefine-syntax
lubdefine-syntax-rule
w rakiecie?
Jako konkretny przykład, oto trywialnyaif
w systemie makr w stylu CL.
(defmacro aif (test if-true &optional if-false)
`(let ((it ,test))
(if it ,if-true ,if-false)))
Chodzi o toit
będzie związany z wynikiemtest
wif-true
iif-false
klauzule. Naiwna transliteracja (bez opcjonalnej alternatywy) to
(define-syntax-rule (aif test if-true if-false)
(let ((it test))
(if it if-true if-false)))
który ocenia bez skargi, ale błędy, jeśli spróbujesz użyćit
w klauzulach:
> (aif "Something" (displayln it) (displayln "Nope")))
reference to undefined identifier: it
Theanaphora
jajko narzędziaaif
tak jak
(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)))))))))
ale rakieta wydaje się nie miećir-macro-transformer
zdefiniowane lub udokumentowane.