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---- | | | --------------