Erlangのプロセス

の勉強。テキストのサンプルをちょっと修正して以下のように:

-module(counter).
-export([start/0,loop/1]).

start() ->
  spawn(counter, loop, [0]).

loop(Val) ->
  receive 
    increment ->
      loop(Val + 1);
    show ->
      io:format("value = ~w~n",[Val]),
      loop(Val)
  end.

counter.erlとしてセーブして、インタプリタから

1> c(counter).
{ok,counter}
2> P = counter:start().
<0.38.0>
3> P ! show.
value = 0
show
4> P ! increment.
increment
5> P ! show.     
value = 1
show

こんな感じ。ってこれでいいんかいな?

再帰する関数であるloopをプロセスとしてspawnして、そこにインタプリタからincrementとかshowとかのメッセージを送っている。
KL1やFlengなら、オブジェクト指向風に書くスタイルを使うところ。明にメッセージやプロセスという概念を言語の中に入れる得失は何だろう?
分散処理系の実現は多分より楽になるとは思う。メッセージの内容以外に通信の必要が無いから(KL1/Flengでは、可能性としてはすべてのメモリ内容が通信の対象となりうる)。でもKL1/Flengなんかに慣れた身からすると、ちょっと変な感じも。