在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)。
答案 0 :(得分:8)
在术语周围加上引号('
)并在其周围包裹quote
表单是相同的。也就是说,他们read
到同一个词。
因此,所有以下表达式在Scheme中都是相同的:
''a
'(quote a)
(quote 'a)
(quote (quote a))
quote
形式意味着“解释下一个作为基准的内容 - 即使它包含另一个quote
”。子句用括号括起来,所以它是一个列表;内在quote
只是一个符号。
在某些情况下,打印机在其输出中使用引号('
)之类的读取器缩写。不过,我有点惊讶你write
做了这件事。对我来说,它总是写为(quote a)
。