以下の書籍に載っているサンプルを実装します。
すごいErlangゆかいに学ぼう!
Erlangにて、マルチプロセスで動くような機能を利用します。
機能概要は以下のような形とします。
「冷蔵庫の中身を管理するアプリ」
・CLI(erlシェル)で実装する
・冷蔵庫に食材(?)追加する機能
・冷蔵庫から食材を出す機能
・可能な限り抽象化する
プログラム
kitchen.erl
-module (kitchen).
-compile (export_all).
fridge (FoodList) ->
receive
{From, {store, Food}} ->
From ! {self (), ok},
fridge ([Food| FoodList]);
{From, {take, Food}} ->
case lists:member (Food, FoodList) of
true ->
From ! {self (), {ok, Food}},
fridge (lists:delete (Food, FoodList));
false ->
From ! {self (), not_found},
fridge (FoodList)
end;
terminate ->
ok
end
.
store (Pid, Food) ->
Pid ! {self (), {store, Food}},
receive
{Pid, Msg} -> Msg
after 3000 ->
timeout
end
.
take (Pid, Food) ->
Pid ! {self (), {take, Food}},
receive
{Pid, Msg} -> Msg
after 3000 ->
timeout
end
.
start () ->
FoodList = [milk, chicken, bread],
spawn(?MODULE, fridge, [FoodList])
.
実行
kitchen_exe
1> c(kitchen).
{ok,kitchen}
2> Pid = kitchen:start().
<0.41.0>
3> kitchen:take(Pid, milk).
{ok,milk}
4> kitchen:take(Pid, milk).
not_found
5> kitchen:store(Pid, tea).
ok
6> kitchen:take(Pid, tea).
{ok,tea}
少しずつErlangの機能が見えてきました。プロセス生成、メッセージパッシング、プロセスライフサイクル、プロセスモニタ、プロセスリンクなど並列、分散処理を実現する上で、考慮しなければならないことが機能やデザインパターンでまとまっていて、凄く勉強になります。
冒頭で挙げた書籍は、Erlangの技術知識もそうですが、関数系言語の説明、複雑なプログラムの抽象化など、たくさんの知識が得られてすばらしい内容ですね(ちょっと古いですが。。)