【发布时间】:2011-02-14 11:46:42
【问题描述】:
我经常发现以下类型的增量定义很有用:
(define (foo) (display "bar"))
(foo)
;prints bar
(define foo (let ((bar foo))
(lambda ()
(display "foo")
(bar))))
(foo)
;prints foobar
如何使用宏执行这种类型的增量定义? 我无法让 let-syntax 提供相同的功能。
目前我使用 plt 方案,但也希望在不同的 lisp 实现中看到答案。
编辑:
天真地我想做以下事情:
(define-syntax foo
(syntax-rules ()
((_) (display "bar"))))
(define-syntax foo
(let-syntax ((old-foo (syntax-rules () ((_) (foo)))))
(syntax-rules ()
((_) (begin
(display "foo")
(old-foo))))))
将原始宏转换为有效的 plt 方案宏:
(require-for-syntax scheme/base)
(define-syntax foo
(syntax-rules ()
[(foo) (display "bar")]))
(define-syntax foo
(let ([old (syntax-local-value #'foo)])
(lambda (stx)
#`(begin #,((syntax-rules ()
[(_) (begin (display "foo"))]) stx)
#,(old #'(_))))))
(foo)
如果我错过了更好的方法,请告诉我。
【问题讨论】: