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.

questionAnswers(3)

yourAnswerToTheQuestion