quote

为了操作以及表示符号数据,在语言中就需要一种新元素:具有表示符号的能力

表示方法是在数据前面加上「单引号」,例如:'(a b)
但是这样就违背了我们程序具有表的形式的普遍性,通过引进特殊形式 quote 就可以恢复这种一致性
例如:(quote a b) 等价与 '(a b)

如下的例子展示了符号和值的区别:

1
2
3
4
5
(define a 1)
(define b 2)

(list a b)      ; => '(1 2)
(list 'a 'b)    ; => '(a b)

单引号和双引号的区别

用双引号扩起来的称为字符串,例如:”String”
单引号可以用于扩起表和符号,是一种结构化的数据;
而双引号只能用于字符串,只是一串字符,一般用于需要打印输出的对象,例如:

1
(display "hi")

但是不能这样:

1
(car "(a b c)")

可以用单引号来实现:

1
(car '(a b c))      ; => 'a

quote, quasiquote, unquote

有时候不想整个表都表示为符号,这时可用 quasiquote 和 unquote 来实现,例如:

1
2
3
4
5
6
7
8
(define a 1)
(define b 2)

`(a ,b)                         ; => '(a 2), b 依旧是那个变量 b
(quasiquote (a (unquote b)))    ; => '(a 2), 和 `(a ,b) 等价

`(,a ,b)                        ; => '(1 2), 从结果上来看等价于 (list a b)
`(a b)                          ; => '(a b), 从结果上来看等价于 (list 'a 'b)