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