この節は、リスト上、すなわちコンスセルの連鎖上のかなりの数の単純な演算 を記述する。
この関数は、(car (cdr (cdr x)))と同等である。同様にこの
パッケージは、xxxが4つまでの‘a’および/または‘d’
である、28個のcxxxr関数すべてを定義する。これらの
関数はすべてsetf可能であり、それらへの呼び出しは、最大の
効率のためにバイトコンパイラでインラインに展開される。
この関数は、(car x)の同義語である。同様に、関数
second、third、…、tenthはリストxの
与えられた要素を戻す。
この関数は、(cdr x)の同義語である。
Common Lispは、この関数はnullと同様に動作するが、xが
nilでもコンスセルでもない場合はエラーを通知するように定義する。
このパッケージは、単にnullの同義語としてendpを定義する。
この関数は、(length x)と正確に同じようにリストxの
長さを戻すが、xが循環リスト(cdr連鎖がnilで
終端するのではなくループを形成する)の場合、この関数はnilを戻す
(正規のlength関数は、循環リストを与えられた場合、はまりこんで
動けなくなるだろう)。
この関数は、リストxの最後のコンスか、最後からn番目のコンス
を戻す。nが省略された場合、1を既定とする。“最後のコンス”は、
そのcdrが別のコンスセルではない、リストの最初のコンスセルを
意味する(通常のリストでは、最後のコンスのcdrはnil
である)。xがnilまたはnよりも短い場合、この関数は
nilを戻す。リストの最後の要素は、
(car (last x))であることに注意せよ。
Emacs関数lastは、付加引数nを扱わないことを除いて
同じことをする。
この関数は、最後の要素、または最後のn個の要素を取り除いたリスト
xを戻す。nが0より大きい場合、オリジナルのリストに損害を
与えないように、リストのコピーを作る。一般に、
(append (butlast x n) (last x n))は、
xと等値なリストを戻す。
これは、リストのコピーを作るのではなく、適切な要素のcdrを破壊的
に修正することで動作するbutlastの版である。
この関数は、その引数のリストを構成する。最後の引数は、構成される最後の
セルのcdrになる。従って、(list* a b c)
は(cons a (cons b c))と同等であり、
(list* a b nil)は(list a b)と
同等である。
(この関数は、Common Lispで実際にlist*と呼ばれることに注意せよ;
member*やdefun*のように、このパッケージのために
発明された名前ではない)
sublistがlistの副リストの場合、すなわち、listの
コンスセルの1つとeqの場合、この関数は、sublistまでで
sublistは含まないlistの部分のコピーを戻す。たとえば、
(ldiff x (cddr x))はリストxの最初の2つの要素を戻す。結果
はコピーである; オリジナルのlistは修正されない。sublistが
listの副リストでない場合、list全体のコピーが戻される。
この関数は、リストlistのコピーを戻す。それは、(1 2 . 3)の
ようなドットリストを正しくコピーする。
この関数は、コンスセルxの木のコピーを戻す。cdr方向沿いに
だけコピーするcopy-sequence(やその別名であるcopy-list)と
は異なり、この関数はcarとcdrの両方の方向に沿って(再帰的
に)コピーする。xがコンスセルではない場合、単にxを変えずに
戻す。付加的なvecp引数が真の場合、この関数はコンスセルと
同じように(再帰的に)ベクタをコピーする。
この関数は、コンスセルの2つの木を比較する。xとyがともに
コンスセルの場合、それらのcarとcdrが再帰的に比較される。
xもyもコンスセルではない場合、eqlか指定されたテスト
に従って比較される。:key関数が指定された場合、両方の木の要素に
適用される。See 列.