【发布时间】:2018-01-08 18:57:34
【问题描述】:
我对宏在 Scheme 中的工作方式(特别是在 Chicken Scheme 中)有一些疑问,让我们考虑这个例子:
(define (when-a condition . body)
(eval `(if ,condition
(begin ,@body)
'())))
(define-syntax when-b
(er-macro-transformer
(lambda (exp rename compare)
(let ((condition (cadr exp))
(body (cddr exp)))
`(if ,condition (begin ,@body) '())))))
(define-syntax when-c
(ir-macro-transformer
(lambda (exp inject compare)
(let ((condition (cadr exp))
(body (cddr exp)))
`(if ,condition (begin ,@body) '())))))
(define-syntax when-d
(syntax-rules ()
((when condition body ...)
(if condition (begin body ...) '()))))
我可以将
when-a视为一个宏吗?我觉得我不能严格地认为它是一个宏,因为我没有使用define-syntax,但我不能说出任何不喜欢这种实现的实际理由。我的宏是否卫生?
when-b和when-c之间有什么区别吗?由于我没有使用rename或inject,我认为没有。
【问题讨论】:
标签: macros scheme chicken-scheme