R:「ほら、空に!ラムダ信号!市民がラムダマンに困っている!」
LM:「わかりました!そして、彼らが必要とするボックスアートだけを持っています。」
Lispsでは、リストは単一にリンクされたデータ構造であり、consセルと呼ばれる要素で構成されています。これらの各セルは、
- 値へのポインタ
- 次のセルへのポインタ
これらは歴史的な理由からそれぞれcarとcdrと呼ばれています。3要素のリストを表す従来のボックスアートは次のとおりです。
Structure: (car . cdr -)--->(car . cdr -)--->(car . cdr)
| | | |
v v v v
Values: 1 2 3 nil
car
and関数を使用するcdr
と、この低レベルの抽象化からのリストを操作して、それぞれのセルの値を返すことができます。したがって、car
セルの「値」を返し、cdr
リストの残りの部分を逆参照します。便宜上nthcdr
の上の一般化です。cdr
によって返される値はcdr
、このレベルで変更可能な生データ構造への参照です。cons-cellのcdrの値を変更すると、リストの基本構造が変更されます。
与えられた:
let A = '(1 2) ~= (1 . -)-->(2 . nil)
let B = '(3 4) ~= (3 . -)-->(4 . nil)
のcdr(cdr A)
をBに設定すると、AとBが破壊的に連結され、Aは次の構造になります。
A B
(1 . -)-->(2 . -)-->(3 . -)-->(4 . nil)
すでに示したようにnil
、セルのcdrの値は、リストの最後を表します。これ以上、トラバースできるものはありません。Aのcdrをに設定するとnil
、リストがロボトミー化され、Aが
A
(1 . nil) <- [Not pointing to anything - the rest of the list shall go wanting]
これは、あなたが行ったこととほぼ同じです。低レベルの関数を使用して、基になるデータ構造を変更しました。:)セルのcdrの1つをに設定することによりnil
、リストの最後を削除しました。