我经常发现有用的下列类型的增量定义的:增量宏定义可能吗?
(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)
如果我缺少一个更好的方法让我知道。
谢谢,我必须包含(需要语法方案/基础)才能在语法阶段定义组合(要在定义语法中定义组合)。你可以评论我的天真方法(添加到问题)没有实施?天气是不是很实际,或者它与现有的语法不一致? – Davorak 2010-05-04 04:09:32
是的,你需要'计划/基地'来组成;但是您可以按任何您想要的方式组合宏函数 - 它们只是从语法到语法的函数,而'syntax-rules'是生成此类函数的方便(通常为第2级)宏。 至于你的幼稚方法,它有一些基本的问题:它试图以某种方式捕获旧的语法,但你不能以这种方式得到它的*值*,所以结果是一个扩展到调用自身的宏。另一个问题是在试图使用'display'来调试东西 - 宏不会*做*它,他们会*扩大*。 – 2010-05-04 04:35:17
谢谢,我知道我无法以这种方式捕捉旧的语法,并且它会扩展到自己。我只是认为它很好地处理了我熟悉的语法,并想知道为什么它存在于函数层次,为什么它不存在于宏观层面,即使似乎没有任何根本阻止编译器以这种方式行事。我试图使用显示作为测试,看看宏是否构建正确,我编辑我的问题翻译我的天真宏到一个工作的PLT计划宏。 – Davorak 2010-05-04 08:35:57