Shammer's Philosophy

My private adversaria

consとlist

consは、与えられた引数を連結してリストを作る、と思っていたが、どうも少し違うようだ。

> (cons 'a 'b)
(A . B)
> (list 'a 'b)
(A B)
> (car (list 'a 'b))
A
> (car (cons 'a 'b))
A
> (cdr (list 'a 'b))
(B)
> (cdr (cons 'a 'b))
B

(A.B)というドットリスト(?)ができてしまった。consで作成されるデータ(コンス)は、普通の(?)リストとは異なるようだ。carの結果は、consで作成されたものでもlistで作成されたものでも同じだが、cdrの結果は異なった。listは、cdrの結果もリストになる、ということ?

> (listp (cons 'a 'b))
T
> (listp (cdr (cons 'a 'b)))
NIL
> (listp (list 'a 'b))
T
> (listp (cdr (list 'a 'b)))
T

どうやらそのようだ。データを連結する際には、consを使うかlistを使うかを気にしないといけない。前、appendを使ってドットリストになってしまったことがあったが。これと何か関係があるのだろうか。