setcdr ¶setcdr 関数は setcar
関数と似ていますが、リストの最初の要素ではなく、2番目以降の要素を置き換える点が異なります。
(リストの最後の要素を変更する方法については、nthcdr 関数と setcdr 関数を使用している kill-new 関数
を参照してください。)
この仕組みを確認するには、次の式を評価して変数の値に家畜のリストを代入してください。
(setq domesticated-animals (list 'horse 'cow 'sheep 'goat))
ここでリストを評価すると、リスト (horse cow sheep goat) が返されます:
domesticated-animals
⇒ (horse cow sheep goat)
次に、setcdr を2つの引数、すなわちリストを値とする変数名と、最初のリストの CDR が設定されるリストを用いて評価します。
(setcdr domesticated-animals '(cat dog))
この式を評価すると、エコー領域にリスト (cat dog)
が表示されます。これが関数から返される値です。私たちが関心を寄せている結果は副作用であり、これは変数 domesticated-animals を評価することで確認できます:
domesticated-animals
⇒ (horse cat dog)
確かに、リストは(horse cow sheep goat)から(horse cat dog)に変更されています。リストのCDRは(cow sheep goat)から(cat dog)に変更されています。