鉴于强大的宏系统,现代Scheme中的`quote`和`quasiquote`是多余的?

时间:2013-04-06 10:54:15

标签: scheme eval racket quotes

Modern Scheme(及其像Racket这样的后代)具有非常强大的卫生宏系统。在我看来,quotequasiquote在定义(不卫生的)宏(在Common Lisp中仍然如此,如果我没有误解的话)已经失去了卫生宏系统的历史地位。实际上,在语言报告中,quotequasiquote仅作为构建数据的便捷方式,特别是列表。如果她能够忍受乏味,那么人们可以没有它们。例如,(quote (+ 1 2))可以重写为(list (quote +) 1 2)(quasiquote (+ (unquote (- 2 1)) 2))可以重写为(list (quote +) (- 2 1) 2)

现在假设我们将符号的新原始类型引入Scheme:以大写字母开头的标识符是一个符号,否则是一个变量。因此,X表示符号x,然后上述示例可以写为(list Plus 1 2)(list Plus (- 2 1) 2)。 (我们假设Plus代表符号+。)现在我们可以说quotequasiquote是多余的吗?或者我会错过什么?

修改

    在某些极少数情况下,
  1. eval似乎仍然有用:EVAL in SCHEME

  2. 澄清问题。

2 个答案:

答案 0 :(得分:5)

你的问题不清楚。您似乎在询问是否对引用有一些技术需求,如果这是真的,那么您的新$ 就像原始'一样。引用带括号的表单的便利性从来都不是绝对必要的,因为你总是可以使用带引号的符号 - 但是当你开始讨论更高的表示级别时,这种方便性非常重要,其中只有原始符号引用意味着表示会爆炸。为了明白我的意思,(+ x 1)的引用变为(list '+ 'x 1),引用变为(list 'list (list 'quote '+) (list 'quote 'x) 1) - 这使得正常quote的优势显而易见......

至于eval有用:它绝对有用。要实现宏的主要内容是它们会转换静态代码片段 - 实际上大多数实现都会将宏扩展为编译的一部分,eval的合理使用正是依赖于它的东西。一些动态生成的输入。

答案 1 :(得分:2)

是的,quote是多余的,但您不需要大写字母约定。您可以让quote后面跟一个标识符(符号)生成一个string->symbol表达式,其中包含符号的字符串内容。

(quote x) => (string->symbol "x")