この関数はコンスセルcons-cellの1番目のスロットが参照する値をリターンする。言い換えるとこの関数はcons-cellのCARをリターンする。
特別なケースとしてcons-cellがnil
の場合、この関数はnil
をリターンする。したがってリストはすべて引数として有効である。引数がコンスセルでもnil
でもなければエラーがシグナルされる。
(car '(a b c)) ⇒ a
(car '()) ⇒ nil
この関数はコンスセルcons-cellの2番目のスロットにより参照される値をリターンする。言い換えるとこの関数はcons-cellのCDRをリターンする。
特別なケースとしてcons-cellがnil
の場合、この関数はnil
をリターンする。したがってリストはすべて引数として有効である。引数がコンスセルでもnil
でもければエラーがシグナルされる。
(cdr '(a b c)) ⇒ (b c)
(cdr '()) ⇒ nil
この関数により他のデータ型によるエラーを起こさずに、コンスセルのCARを取得できり。この関数はobjectがコンスセルならobjectのCAR、それ以外はnil
をリターンする。この関数は、objectがリストでなければエラーをシグナルするcar
とは対象的である。
(car-safe object) ≡ (let ((x object)) (if (consp x) (car x) nil))
この関数により他のデータ型によるエラーを起こさずに、コンスセルのCDRを取得できる。この関数はobjectがコンスセルならobjectのCDR、それ以外はnil
をリターンする。この関数は、objectがリストでないときはエラーをシグナルするcdr
とは対象的である。
(cdr-safe object) ≡ (let ((x object)) (if (consp x) (cdr x) nil))
このマクロはリストのCARを調べて、それをリストから取り去るのを一度に行なう便利な方法を提供する。この関数はlistnameに格納されたリストにたいして処理を行なう。この関数はリストから1番目の要素を削除して、CDRをlistnameに保存し、その後で削除した要素をリターンする。
もっとも単純なケースは、リストに名前をつけるためのクォートされていないシンボルの場合である。この場合、このマクロは(prog1 (car listname) (setq listname (cdr listname)))
と等価である。
x ⇒ (a b c) (pop x) ⇒ a x ⇒ (b c)
より一般的なのはlistnameが汎変数(generalized
variable)の場合である。この場合、このマクロはsetf
を使用してlistnameに保存する。ジェネリック変数を参照のこと。
リストに要素を追加するpush
マクロについてはリスト変数の変更を参照のこと。
この関数はlistのn番目の要素をリターンする。要素は0から数えられるのでlistのCARは要素0になる。listの長さがn以下なら値はnil
。
(nth 2 '(1 2 3 4)) ⇒ 3
(nth 10 '(1 2 3 4)) ⇒ nil (nth n x) ≡ (car (nthcdr n x))
これは関数elt
も類似しているが、任意の種類のシーケンスに適用される。歴史的な理由によりこの関数は逆の順序で引数を受け取る。シーケンスを参照のこと。
この関数はlistのn番目のCDRをリターンする。言い換えると、この関数はlistの最初のn個のリンクをスキップしてから、それ以降をリターンする。
nが0ならnthcdr
はlist全体をリターンする。listの長さがn以下ならnthcdr
はnil
をリターンする。
nthcdr
のエイリアスはdrop
。
(nthcdr 1 '(1 2 3 4)) ⇒ (2 3 4)
(nthcdr 10 '(1 2 3 4)) ⇒ nil
(nthcdr 0 '(1 2 3 4)) ⇒ (1 2 3 4)
この関数はlistの最初のn個の要素をリターンする。要するにlistからnthcdr
をスキップした部分をリターンする。
listの要素の数がnより少なければlist、nが0か負ならnil
をリターンする。
一般的に(append (take n list) (drop n
list))
はlistと同じリストをリターンする。
(take 3 '(a b c d)) ⇒ (a b c)
(take 10 '(a b c d)) ⇒ (a b c d)
(take 0 '(a b c d)) ⇒ nil
これは引数であるリストの構造を破壊的に変更することによって機能するバージョンのtake
である。これにより高速になるが、listの元の値は失われるだろう。
ntake
は要素の数がnより少なければ変更せずにlistを、nが0か負ならnil
をリターンする。それ以外の場合には最初のn個の要素に切り詰められたlistをリターンする。
これはnが正だと判っていない場合には単純に切り詰め効果を信頼するのではなく、通常はリターン値を使うほうが賢明だということを意味している。
この関数はlistの最後のリンクをリターンする。このリンクのcar
はこのリストの最後の要素。listがnullならnil
がリターンされる。nが非nil
ならn番目から最後までのリンクがリターンされる。nがlistの長さより大きければlist全体がリターンされる。
この関数はエラーや無限ループの危険なしで、listの長さをリターンする。この関数は一般的に、リスト内のコンスセルの個数をリターンする。しかし循環リストでは単に上限値が値となるため、非常に大きくなる場合があります。
listがnil
とコンスセルのいずれでもなければsafe-length
は0をリターンする。
循環リストを考慮しなくてもよい場合にリストの長さを計算するもっとも一般的な方法は、length
を使う方法です。シーケンスを参照してください。
これは(car (car cons-cell))
と同じ。
これは(car (cdr cons-cell))
か(nth 1 cons-cell)
と同じ。
これは(cdr (car cons-cell))
と同じ。
これは(cdr (cdr cons-cell))
か(nthcdr 2 cons-cell)
と同じ。
上記に加えてcxxxr
やcxxxxr
のようなcar
とcdr
で構成される24の関数が定義されています。ここでx
はa
かd
のいずれかです。cadr
とcaddr
とcadddr
はそれぞれリストの2つ目、3つ目、4つ目の要素です。cl-libは同じものをcl-second
、cl-third
、cl-fourth
という名前で提供しています。List
Functions in Common Lisp Extensionsを参照してください。
この関数はリストxから、最後の要素か最後のn個の要素を削除してリターンする。nが0より大きければこの関数はリストのコピーを作成するので、元のリストに影響はない。一般的に(append
(butlast x n) (last x n))
は、xと等しいリストをリターンする。
この関数はリストのコピーを作成するのではなく、cdr
を適切な要素に変更することにより破壊的に機能するバージョンのbutlast
である。