1

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是多余的吗?还是我错过了什么?

编辑

  1. eval在极少数情况下似乎仍然有用:SCHEME 中的 EVAL

  2. 澄清的问题。

4

2 回答 2

6

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

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

于 2013-04-06T13:08:50.883 回答
2

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

(quote x) => (string->symbol "x")
于 2013-04-06T15:18:44.370 回答