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