受到有关函数而不是宏的相关问题的评论线程的启发。
有什么方法可以扩展一个 Scheme 语法定义,以便它可以在新定义中使用之前的语法定义?此外,这必须是可扩展的,也就是说,必须可以将技术链接在一起多次。
例如,假设我们想要扩展lambda
,以便每次调用定义的函数时lambda
,它都会在执行函数体之前打印“foo”。我们可以通过以下方式做到这一点:
(define-syntax old-lambda lambda)
(define-syntax lambda
(syntax-rules ()
((_ args body ...)
(old-lambda args (display "foo") body ...))))
我们还可以通过执行以下操作以另一种方式扩展它(例如,通过打印“bar”):
(define-syntax old-lambda-2 lambda)
(define-syntax lambda
(syntax-rules ()
((_ args body ...)
(old-lambda-2 args (display "bar") body ...))))
最终结果是使用我们的 new 定义的函数将在lambda
每次调用时打印“foo”,然后打印“bar”。
然而,除了用大量old-lambda-<x>
的old-lambda-<x>
. 这不能自动化,因为您也不能gensym
在语法定义中使用。因此,没有很好的方法可以使其可扩展;唯一可行的解决方案是将每一个old-lambda-print-foo
或类似的东西命名为消除歧义,这显然不是一个万无一失的解决方案。(举个如何失败的例子,假设代码的两个不同部分被扩展lambda
为打印“foo”;自然,他们都会命名它old-lambda-print-foo
,瞧!lambda
现在是一个无限循环。)因此,这将是非常如果我们能够以理想的方式做到这一点,那就太好了:
- 不需要我们用大量的污染命名空间
old-lambda-<x>
- 或者,如果做不到这一点,保证我们不会发生冲突。