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:以大写字母开头的标识符是一个符号,否则是一个变量。因此,X
表示符号x
,然后上述示例可以写为(list Plus 1 2)
和(list Plus (- 2 1) 2)
。 (我们假设Plus
代表符号+
。)现在我们可以说quote
和quasiquote
是多余的吗?或者我会错过什么?
修改:
eval
似乎仍然有用:EVAL in SCHEME
澄清问题。
答案 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")