Захват макросов в схеме
Какие'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
определено или задокументировано.