この関数は、コンスセル 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に格納されているリストに対して動作します。リストから最初の要素を取り出し、そのCDRをlistnameに保存した後、取り出された要素を返します。
最も単純なケースでは、listname
はリスト名を示すクォートなしのシンボルであり、その場合、このマクロは (prog1 (car listname) (setq listname (cdr listname)))
と等価になります。
x
⇒ (a b c)
(pop x)
⇒ a
x
⇒ (b c)
より一般的に、listname は一般化変数となり得ます。その場合、このマクロは 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 がスキップする部分を返します。
take は、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 が正であることが分かっている場合を除き、単に切り捨て効果に頼るのではなく、通常は戻り値を利用するのが望ましいということです。
この関数は、述語 pred が nil
以外を返す先頭のリスト要素をスキップし、残りを返します。
(drop-while #'numberp '(1 2 a b 3 4))
⇒ (a b 3 4)
この関数は、述語 pred が non-nil
を返す先頭のリスト要素を返し、それ以外は無視します。
一般的に、(append (take-while p list) (drop-while p list)) は list と等しいリストを返します。
(take-while #'numberp '(1 2 a b 3 4))
⇒ (1 2)
この関数は、list のすべての要素に対して pred
が真である場合に t を返します。
(all #'numberp '(1 2 3 4)) ⇒ t (all #'numberp '(1 2 a b 3 4)) ⇒ nil (all #'numberp '()) ⇒ t
この関数は、list の少なくとも1つの要素に対して pred が真である場合、非 nil
を返します。返される値は、最初の要素が pred を満たす最長の list サフィックスです。
(member-if #'symbolp '(1 2 3 4)) ⇒ nil (member-if #'symbolp '(1 2 a b 3 4)) ⇒ (a b 3 4) (member-if #'symbolp '()) ⇒ nil
この関数は member-if のエイリアスです。戻り値を利用せず、単に nil
であったかどうかのみを確認するような文脈では、こちらの方が好ましい場合があります。
この関数は 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) と同じです。
上記に加え、car および cdr のさらに
24 通りの構成が cxxxr および cxxxxr として定義されており、ここで各 x は a
または d のいずれかとなります。cadr、caddr、および cadddr は、それぞれリストの 2 番目、3 番目、または 4 番目の要素を取り出します。cl-lib は、cl-second、cl-third、および cl-fourth
という名称で同様の機能を提供します。Common Lisp Extensions の List
Functions を参照してください。
この関数は、最後の要素、または最後の n 個の要素を取り除いたリスト x を返します。n が 0
より大きい場合は、元のリストを変更しないようリストのコピーを作成します。一般に、(append (butlast
x n) (last x n)) は x と等しいリストを返します。
これは、リストのコピーを作成するのではなく、該当する要素の cdr を破壊的に変更することで動作する
butlast のバージョンです。