Racket/数据类型
外观
< Racket
cons和list
[编辑](cons a b)
接受两个参数,当第二个参数不是列表,不为空且不是由cons产生的元素时,结果被打印为(a . b)
,两个元素插入括号中,且被点隔开。
cons返回的数据并不一定是一个list,而是一个对(pair),可以使用pair?
判断。
一个对的前后两个元素分别被称为car
和cdr
>(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