Modern Scheme(及其后代如 Racket)具有非常强大的卫生宏系统。在我看来,quote
他们quasiquote
在定义(不卫生的)宏(如果我没有弄错的话,Common Lisp 中仍然这样做)到卫生的宏系统方面已经失去了他们的历史地位。实际上在语言报告中,quote
并且quasiquote
仅作为构建数据的便捷方式呈现,特别是列表。确实,如果她能忍受乏味的话,没有他们也可以。例如,(quote (+ 1 2))
可以改写为(list (quote +) 1 2)
,(quasiquote (+ (unquote (- 2 1)) 2))
可以改写为(list (quote +) (- 2 1) 2)
。
现在假设我们在 Scheme 中引入了符号的新原始类型:以大写字母开头的标识符是符号,否则是变量。SoX
表示符号x
,那么上面的例子可以写成(list Plus 1 2)
and (list Plus (- 2 1) 2)
。(让我们假设Plus
代表符号+
。)现在我们可以这么说quote
并且quasiquote
是多余的吗?还是我错过了什么?
编辑:
eval
在极少数情况下似乎仍然有用:SCHEME 中的 EVAL澄清的问题。