pair とリスト構造 (4/5)


cons/car/cdr が行うこと

(cons a b) を行う際、a, bがリスト構造をなしている場合も、 a, b の copy を行っているわけではありません。単に、 a, b をそれぞれ指している新たな pair (cons cell) を作るだけです。 例えば、以下の例においては、 x, y は、ともに car, cdr 要素として a を指しています。 また、 x, y は別々の cons cell を指しています(参考下図)。 同様に、 car/cdr 命令も、リスト構造のコピーを行うわけではありません。 単に、各 pair の car/cdr field が指しているリスト構造そのものを返すだけです。

今現在は、 リスト構造への代入操作を教えていないため、 同じリスト構造を指しているのかコピーを指しているのかを調べる術は、 eq? などをもちいるしか方法がありません。 eq? はリスト構造については、同じ cons cell を示しているかどうかを判断します *

> (define a '(p q))
> (define x (cons a a))
> (define y (cons a a))
> x
((p q) p q)
> y
((p q) p q)
> (eq? x y)
#f                   ; x と y は別の pair を指している
> (eq? (car x) (cdr x))
#t                   ; (car x) と (car y) は同じ pair を指す


99.10.6/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp