R:「ほら、空に!ラムダ信号!市民がラムダマンに困っている!」
LM:「わかりました!そして、彼らが必要とするボックスアートだけを持っています。」
Lispsでは、リストは単一にリンクされたデータ構造であり、consセルと呼ばれる要素で構成されています。これらの各セルは、
- 値へのポインタ
- 次のセルへのポインタ
これらは歴史的な理由からそれぞれcarとcdrと呼ばれています。3要素のリストを表す従来のボックスアートは次のとおりです。
Structure: (car . cdr -)--->(car . cdr -)--->(car . cdr)
| | | |
v v v v
Values: 1 2 3 nil
carand関数を使用する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、リストの最後を削除しました。