Next: Setcdr, Up: Modifying Lists [Contents][Index]
setcarコンスセルのCARの変更は、setcarにより行なわれます。リストにたいして使用された場合、setcarはリストの1つの要素を、他の要素に置き換えます。
この関数は、以前のCARを置き換えて、consの新しいCARにobjectを格納します。他の言い方をすると、この関数はconsのCARスロットを、objectを参照するように変更します。この関数は値objectをreturnします。たとえば:
(setq x '(1 2))
⇒ (1 2)
(setcar x 4)
⇒ 4
x
⇒ (4 2)
コンスセルが、複数のリストが共有された構造の一部の場合、コンスに新しいCARを格納することにより、これら共有されたリストの各1つの要素を変更します。以下は例です:
;; 部分的に共有された2つのリストを作成。
(setq x1 '(a b c))
⇒ (a b c)
(setq x2 (cons 'z (cdr x1)))
⇒ (z b c)
;; 共有されたリンクのCARを置き換え。 (setcar (cdr x1) 'foo) ⇒ foo x1 ; 両方のリストが変更された。 ⇒ (a foo c) x2 ⇒ (z foo c)
;; 共有されていないリンクのCARを置き換え。 (setcar x1 'baz) ⇒ baz x1 ; 1つのリストだけが変更された。 ⇒ (baz foo c) x2 ⇒ (z foo c)
なぜbを置き換えると両方が変更されるのかを説明するために、変数x1とx2の2つのリストによる共有構造を視覚化してみましょう:
--- --- --- --- --- ---
x1---> | | |----> | | |--> | | |--> nil
--- --- --- --- --- ---
| --> | |
| | | |
--> a | --> b --> c
|
--- --- |
x2--> | | |--
--- ---
|
|
--> z
同じ関係を別のボックス図で示すと、以下のようになります:
x1:
-------------- -------------- --------------
| car | cdr | | car | cdr | | car | cdr |
| a | o------->| b | o------->| c | nil |
| | | -->| | | | | |
-------------- | -------------- --------------
|
x2: |
-------------- |
| car | cdr | |
| z | o----
| | |
--------------