Racket/数据类型

维基教科书,自由的教学读本

cons和list[编辑]

(cons a b)接受两个参数,当第二个参数不是列表,不为空且不是由cons产生的元素时,结果被打印为(a . b),两个元素插入括号中,且被点隔开。 cons返回的数据并不一定是一个list,而是一个(pair),可以使用pair?判断。 一个对的前后两个元素分别被称为carcdr

>(car (cons a b))
a
>(cdr (cons a b))
'(b)
>(cons (list a b) c)
'((a b) . c)
>(cons a (list b c))
'(a b c)

一般一个对的表示法是用一个. 点 隔开,除非点后面跟了一个(开的括号,这种情况下删去点和这对匹配的括号。 就是'(a . (b . c))变为'(a b . c)'(a . (b . (c . ())))变为'(a b c)

一个列表在打印的时候一般都会在前面加一个引用标记,如果列表元素本身是列表的话,列表内的列表不会重复使用引用标记。

>(list (list a b c) (list c d e) (list f g h))
'((a b c) (c d e) (f g h))

quote可以简单的将列表或对表示为S表达式的形式

>(quote (a (b c d) "asas" (d q e)))
'(a (b c d) "asas" (d q e))
>(quote (a . b))
'(a . b)
>(quote (a . (b . c)))
'(a b . c)

如果用引用标记包裹一个标识符的话,会得到一个加了'的看起来很像标识符的字符

>map
#<procedure:map>
>(quote map)
'map
>(symbol? (quote map))
#t
>(procedure? map)
#t
>(string->symbol "map")
'map
>(symbol->string (quote map))
"map"

引用符号对数字和字符串没有影响 '引用适用于输入,也适用于输出

>(car ''ada)
'ada
>(car '(quote ada))
'quote
>(quote (quote aba))
''aba
>'(quote aba)
''aba