Scheme和Racket中嵌套引号的行为

时间:2011-11-02 16:55:19

标签: scheme racket

在Racket中编写函数时,我意外地将两个单引号放在符号前面而不是一个。即我意外地写了''并且发现了一些看似奇怪的嵌套引号的行为。我正在使用DrRacket并使用Racket lang和R5RS lang进行测试。

(write (pair? (quote (quote a))))

打印:#t。

(write (car (quote (quote a))))

打印:引用

但是

(write (quote (quote a)))

(write '(quote a)))

两者都打印:'a

有人能告诉我为什么在Scheme(和Racket)中使用函数对吗?解释(引用(引用a)))作为一对两个元素引用和a,但函数write打印出'a而不是(引用a)。

1 个答案:

答案 0 :(得分:8)

在术语周围加上引号(')并在其周围包裹quote表单是相同的。也就是说,他们read到同一个词。

因此,所有以下表达式在Scheme中都是相同的:

''a
'(quote a)
(quote 'a)
(quote (quote a))

quote形式意味着“解释下一个作为基准的内容 - 即使它包含另一个quote”。子句用括号括起来,所以它是一个列表;内在quote只是一个符号。

在某些情况下,打印机在其输出中使用引号(')之类的读取器缩写。不过,我有点惊讶你write做了这件事。对我来说,它总是写为(quote a)