「すごいErlangゆかいに学ぼう!」4章〜5章の途中

すごいErlangゆかいに学ぼう!」の読書メモ。

今日は、4章から5章の途中までです。

4章

動的型付け

Erlangはランタイムにエラーが取得される動的言語だけど、他の多くの動的言語よりも安全だという話。実績として、可用性の高いネットワークスイッチの例が挙げられている。

Erlangにはプログラムを異なるノードに配布できる機能が言語に含められています。

おーこれこれ。可用性の向上に寄与する言語特性について知りたくて読んでるのだった。

簡単に言えば、たいていの言語や型システムはプログラムからエラーを取り除くことを目標としている一方で、Erlangは、エラーはどうせ起きるのだからエラーから確実に回復するようにしようという戦略に立っているということです。

詳細はまだ先のお楽しみ :)

型変換

すべての型変換用関数の一覧がある。気になったのをチェック。

integer_to_list関数が2つある(integer_to_list/1とinteger_to_list/2)。integer_to_list/2は、第2引数に基数を取るらしい。

binary_to_termのterm、list_to_pidのpid、port_to_listのportなど、見慣れないデータ型があるなぁ。

型テストBIF(Built-in Function)

型を確認するための関数が紹介されている。is_atom/1, is_integer/1などで、いずれもtrueかfalseを返す。これらはガード式の中で使える。

type_of(X)といった型そのものを返す関数(Javaでいうとinstance ofのようなもの)が存在しないのは、型による分岐に対して処理を記述するよりも、把握済みの型に対する処理を記述する方が、Erlang的には好ましいから、とのこと。

5章

再帰の動き

再帰が停止する条件=終了条件の定義が必要という話。

再帰を書く簡単な方法は、書こうとする関数に対する最も単純な入力を考えて、終了条件を最初に書くことらしい。

p.52のサンプルコード。

fac(0) -> 1;
fac(N) when N > 0 -> N*fac(N-1).

この関数に引数として4を与えたときの処理を、図にしてみる。

関数を呼び出し続けて終了条件まで行き着いた後で、途中結果を回収しながら最初の呼び出し元に戻ってきている。

末尾再帰

演算をスタックして線形な処理になる再帰を、そうでない形に変更する話。

計算結果の保存場所として、アキュムレータ(一時変数)を導入する。

p.54のサンプルコード。

tail_fac(N) -> tail_fac(N,1).

tail_fac(0,Acc) -> Acc;
tail_fac(N,Acc) when N > 0 -> tail_fac(N-1,N*Acc).

おぉ、これは前回の記事に追記した、itawasaさんによるinsert関数とよく似た形。

この関数に引数として4を与えたときの処理を、図にしてみる。

アキュムレータで途中の計算結果を持ち回ることで、同じ関数を何度も呼び出すだけで結果を得ている。

今日は、ここまで。