-
Notifications
You must be signed in to change notification settings - Fork 21
/
03.06 符号(Symbol)
63 lines (48 loc) · 1.95 KB
/
03.06 符号(Symbol)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
3.6 符号(Symbol)
符号是一个原子值,它像前面的标识符那样以'前缀打印。一个表达式以'开始并以标识符继续表达式产生一个符号值。
例如:
> 'a
'a
> (symbol? 'a)
#t
对于任何字符序列,一个相应的符号被保留;调用string->symbol程序,或读入一个语法标识,产生一个保留符号。由于互联网的符号可以方便地用eq?(或这样:eqv?或equal?)进行比较,所以他们作为一个易于使用的标签和枚举值提供。
符号是区分大小写的。通过使用一个#ci前缀或其他方式,在读者保留默认情况下,读者可以将大小写字符序列生成一个符号。
例如:
> (eq? 'a 'a)
#t
> (eq? 'a (string->symbol "a"))
#t
> (eq? 'a 'b)
#f
> (eq? 'a 'A)
#f
> #ci'A
'a
任何字符串(即,任何字符序列)都可以提供给string->symbol以获得相应的符号。读者输入任何字符都可以直接出现在一个标识符里,除了空白和以下特殊字符:
( ) [ ] { } ” , “ ' ` ; # | \
实际上,#只有在一个符号开始是不允许的,或者仅仅如果随后是%;然而,#也被允许。同样。.它本身不是一个符号。
空格或特殊字符可以通过用|或\引用包含标识符。这些引用机制用于包含特殊字符或可能看起来像数字的标识符的打印形式中。
例如:
> (string->symbol "one, two")
'|one, two|
> (string->symbol "6")
'|6|
write函数打印一个没有‘前缀的符号。一个符号的display表与相应的字符串相同。
例如:
> (write 'Apple)
Apple
> (display 'Apple)
Apple
> (write '|6|)
|6|
> (display '|6|)
6
gensym和string->uninterned-symbol程序产生新的非保留(uninterned)符号,那不等同(比照eq?)于任何先前的保留或非保留符号。非保留符号是可用的新标签,不能与任何其它值混淆。
例如:
> (define s (gensym))
> s
'g42
> (eq? s 'g42)
#f
> (eq? 'a (string->uninterned-symbol "a"))
#f