次へ 前へ 目次へ 佐々木将人の個人ページへ

3 Erlangにおけるリスト

 Erlangにもリストというデータ構造が存在します。
 ErlangはBEAMという仮想機械への命令にコンパイルして利用するものです。したがってリストの内部構造がLispと同じであるということはできないのですが,それでもLispにおける内部構造を想定するとErlangのリストも理解が早いと思います。

   まず,リストの表現ですが,これはLispとは全く違います。Erlangのリストは「()」ではなく「[]」で囲ったものです。またLispでは各要素を区切るものは空白(正確には区切り文字と呼ばれるもの)でしたが,Erlangでは「,」です。

 しかし,表現以外ではLispの内部構造を想定すると話が早いです。
 リストは要素が空でもかまいません。また要素がリストでもかまいません。要素に制限はないのです。
 リストの head と tail というのはErlangにおける用語で,head を取得する関数が「hd」,tail を取得する関数が「tl」と言いますが
> hd([1,2,3,4]).
が 1 なのはともかく
> tl([1,2,3,4]).
が [2,3,4] なのは,「何それ?」ってなると思いますし,実際「すごいE」rlangゆかいに学ぼうって「本」では,イラスト入りでその説明をしているところですが……。
 Lispの内部構造と同じだとわかれば話は簡単です。hd は car,tl は cdr というだけのことです。
 car と cdr があれば cons もあるんじゃないか……あります!
> [1 | [2,3,4] ].
は,[1,2,3,4] となります。ここの | が,Erlangではcons演算子と呼ばれています。

 なお,Lispで末尾が (1 2 3 . 4) のようにドット対でしか表現できないもの,すなわち,Lispの内部構造で,末端のcons cellの後半部がNILにならないものは,Erlangではエラーになります。その種のリストはErlangでは非真正リストと呼ばれています。

(2023.5.19. 初版)

次へ 前へ 目次へ 佐々木将人の個人ページへ