この節ではリスト(list)を扱います。
Erlangにおけるリストの概念は他の言語のものとほとんど同じですが、
Erlangではリストを多用するため、きちんと概念を身につける必要があります。
リスト内包表記については別の章で取り扱います。
リストとは個数が決まっていないデータの集まりを格納する型です。
タプルは定まった数のデータを扱うのが得意なのに対し、リストはデータの追加といった制御を得意とします。
リストの書式は大括弧([])の中にコンマ(,)で区切ったタームを格納するという形です。
[Term1, . . . ,TermN]
例えば、
[lisp,fortran,ada,cobol]
[{good,erlang}, hello, [1, 2, 3]]
[]
のようなものです。[]は空のリストとなります。
また、Java等のリストと異なり、リスト内の型に一貫性は必要ありません。
好きな要素を好きなように入れることが可能です。
[hello,33,{apple,150},erlang]
のようなものでも大丈夫です。
しかし、上のようなリストは非常に利用し辛いものなので、
特定の用途(debug等)以外では複数の型を入れると言った利用の仕方はしないほうが良いと思います。
まず、リストで使用する用語を覚えて下さい。
リストの先頭はヘッド(Head)と呼ばれます。
ヘッド以外の部分はテール(Tail)と呼ばれます。
例えば、リスト[a,b,c,d,e,f]では、ヘッドがaで、テールは2番目以降(b,c,d,e,f)となります。
この構造は[ H | T ]と表現でき、H が ヘッド で T が テール となります。
この表記を使ってリストの先頭を簡単に切り離したり、先頭に値を付け加えたりすることが可能です。
1> List = [1,2,3,4,5].
[1,2,3,4,5]
ヘッドの取り出し
2> [H | T] = List.
[1,2,3,4,5]
3> H.
1
4> T.
[2,3,4,5]
結合
5> List2 = [0 | List].
[0,1,2,3,4,5]
リストは先頭から最後尾まで鎖のように繋がっているというデータ構造です。 したがって、その構造上リストのヘッドには非常に効率よくアクセスできます。 逆に、後ろの方へ行けば行くほど、アクセスの効率が悪くなります。
自分でプログラムのデータ構造を決める際には、ヘッドに対する処理を行うような仕組みにすることが望ましいです。
例えば、要素をリストにどんどん追加していく場合は、後ろではなく前に追加していくべきだと思われます。
そしてそれを最後に関数を用いてひっくり返してあげれば、後ろに追加していったものと同じ形になります。
> lists:reverse([1,2,3,4]).
[4,3,2,1]
> [1,2,3,4] ++ [5,6,7,8].
[1,2,3,4,5,6,7,8]
> lists:append([1,2,3,4],[5,6,7,8]).
[1,2,3,4,5,6,7,8]
> lists:append([ [1,2], [3,4], [5,6], [7,8] ]).
[1,2,3,4,5,6,7,8]
> lists:last([1,2,3,hello,4,5]).
5
> length([1,2,3,4,5,6,7,8,9]).
9
> hd([1,2,3,4,5]).
1
> tl([geesties, guilies, beasties]).
[guilies, beasties]
> is_list([hello,erlang]).
true
> list_to_atom("Erlang").
'Erlang'
> list_to_atom([30,430,hello]).
** exception error: bad argument
in function list_to_atom/1
called as list_to_atom([30,430,hello])
> atom_to_list('Erlang').
"Erlang"
> list_to_float("2.2017764e+0").
2.2017764
> float_to_list(7.0).
"7.00000000000000000000e+00"
> list_to_integer("123").
123
> integer_to_list(77).
"77"
> erlang:list_to_integer("3FF", 16).
1023
> erlang:integer_to_list(1023, 16).
"3FF"
> list_to_pid("<0.4.1>").
<0.4.1>
> Pid = spawn(fun() -> receive X -> X end end).
<0.59.0>
19> pid_to_list(Pid).
"<0.59.0>"
> list_to_tuple([share, ['Ericsson_B', 163]]).
{share, ['Ericsson_B', 163]}
> tuple_to_list({share, {'Ericsson_B', 163}}).
[share,{'Ericsson_B',163}]