「CARとCDR」の版間の差分

削除された内容 追加された内容
m編集の要約なし
1行目:
{{読み仮名|'''CAR'''と'''CDR'''|カーとクダー}}は、[[LISP]]言語の基本的なデータ型である[[リスト (抽象データ型)|リスト]]を操作するためのもっとも基本的な2つの関数である。CARはリストの先頭要素を返し、CDRは先頭要素以外を返す。
 
LISPではリストは[[cons (Lisp)|コンス]]('''ペア'''または'''ドット対'''とも呼ばれる)の鎖によって実現されており、CARとCDRという名前はコンスを構成する2つの部分を指すのにも用いられる。
17行目:
リストLの2番目の要素は {{code|lang=lisp|(car (cdr L))}}、3番目の要素は {{code|lang=lisp|(car (cdr (cdr L)))}} のようにして得られる。Common Lispなどの多くのLISP方言では、簡略化するために、{{code|lang=lisp|(car (cdr L))}} と同じことをする {{code|lang=lisp|(cadr L)}} という関数が定義されている。同様に caddr, cadddr なども存在する。
 
関数car/cdrの引数が空リストである場合、Common Lispでは空リストを返す<ref>COMMON LISP 第2版 p.361</ref>。[[Scheme]]ではエラーになる<ref>{{cite book|chapterurl=https://www.scheme.com/tspl4/objects.html#./objects:h3|chapter=Operations on Objects|title=The Scheme Programming Language|author=R. Kent Dybvig|edition=4th|publisher=The MIT Press|year=2009|isbn=978-0-262-51298-5}}</ref>。
 
car/cdrは、consと逆のことをする関数である。すなわち{{code|lang=lisp|(car (cons X Y))}}は X に、{{code|lang=lisp|(cdr (cons X Y))}} は Y に等しい。また、{{code|lang=lisp|(cons (car L) (cdr L))}} は L と構造的には等しい(同じオブジェクトを指すとは限らない)。
35行目:
</syntaxhighlight>
のように定義できる(なお、上記の例はいずれも空リストが真偽値として偽になることを利用している)。
 
== LISP以外の言語 ==
[[LOGO]]では、最初の要素をFIRST、それ以外の要素をBUTFIRSTで取得する。
 
[[Prolog]]では、リストを{{code|lang=prolog|[X{{!}}Y]}}とパターンマッチ([[ユニフィケーション|単一化]])させることで、Xに先頭要素が、Yに先頭要素以外が得られる。空リストにはマッチしない。
 
[[Haskell]]でも同様に、リストを{{code|lang=haskell|(x:y)}}とパターンマッチさせることで、xに先頭要素が、yに先頭要素以外が得られる。空リストにはマッチしない。
 
== 脚注 ==