在Scheme和Racket中使用嵌套引号

Har*_*ier 6 scheme racket

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

(write (pair? (quote (quote a))))
Run Code Online (Sandbox Code Playgroud)

打印:#t.

(write (car (quote (quote a))))
Run Code Online (Sandbox Code Playgroud)

打印:报价

(write (quote (quote a)))
Run Code Online (Sandbox Code Playgroud)

(write '(quote a)))
Run Code Online (Sandbox Code Playgroud)

两个都打印:'a

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

Rya*_*per 8

在句子'周围加上引号()并quote在其周围包装表单是完全相同的.也就是说,他们read是同一个词.

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

''a
'(quote a)
(quote 'a)
(quote (quote a))
Run Code Online (Sandbox Code Playgroud)

quote形式是指"解释未来为基准随之而来---即使它包含另一个quote".子句用括号括起来,所以它是一个列表; 内在quote只是一个象征.

在某些情况下,打印机使用读取器缩写,如'输出中的引号().不过,我有点惊讶你必须write这样做; 对我来说,它总是写作(quote a).