setcar ¶その名前から推測できる通り、setcar と setcdr 関数は、リストの CAR または CDR を新しい値に設定します。これらは実際に元のリストを変更しますが、car と cdr
は元のリストをそのままにします。これがどのように動作するかを確認する一つの方法は、実際に試してみることです。まずは setcar 関数から始めてみましょう。
まず、リストを作成し、setq という特殊形式を用いて変数にそのリストを代入します。setcar を使ってリストを変更するつもりなので、この setq では引用形式の '(antelope giraffe lion
tiger)
を使うべきではありません。そうすると、プログラムの一部となるリストが生成されてしまい、実行中にプログラムの一部を変更しようとした際に予期せぬ問題が発生する恐れがあるためです。一般的に、Emacs
Lisp プログラムの構成要素は、プログラムの実行中は定数(あるいは不変)であるべきです。そこで、代わりに list 関数を用いて、次のように動物のリストを構築します。
(setq animals (list 'antelope 'giraffe 'lion 'tiger))
GNU EmacsのInfoでこれを読んでいる場合は、式の後にカーソルを置き、C-x C-eと入力するという通常の方法でこの式を評価できます。(今まさにこれを書きながらそうしています。これが、コンピューティング環境にインタプリタが組み込まれていることの利点の一つです。ちなみに、最後の括弧の後の行にコメントなど何もない場合は、ポイントは次の行にあっても構いません。したがって、カーソルが次の行の1列目にあるなら、それを移動させる必要はありません。実際、Emacsでは最後の括弧の後に任意の量の空白を入れることができます。)
変数 animals を評価すると、それがリスト (antelope giraffe lion tiger) に束縛されていることがわかります:
animals
⇒ (antelope giraffe lion tiger)
言い換えれば、変数 animals はリスト (antelope giraffe lion tiger) を指しています。
次に、変数 animals とクォートされたシンボル hippopotamus という2つの引数を渡しながら関数 setcar を評価します。これは、3要素のリスト (setcar
animals 'hippopotamus) を記述し、それを通常の方法で評価することで行います:
(setcar animals 'hippopotamus)
この式を評価した後、変数 animals
をもう一度評価してください。動物のリストが変わっていることがわかるはずです:
animals
⇒ (hippopotamus giraffe lion tiger)
リストの最初の要素 antelope は hippopotamus に置き換えられます。
このように、setcarはconsのようにリストに新しい要素を追加したのではなく、antelopeをhippopotamusに置き換え、リストを変更したことがわかります。