Erlangプロセス Schemeアクタ

30分プログラム、その444。id:Gemmaさんに昔のbit誌にのっていた「Scheme 過去・現在・未来」のコピーを貰ったので、そこに載っていたSchemeのアクタをErlangで再現してみた。

やっていることはErlang プロセス <=> Scheme アクタ - Gemmaの日記と同じですし、bit誌の内容はおおよそhttp://www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/actor/actor.htmlと同じです。
ただ、factrialのアクター版の定義にactrialと名付けていたのは半端なくクールだったのでマネせずにはいられなかっただけです。

使い方

1> actrial:test(10).
{10,<0.54.0>}
3628800

ソースコード

-module(actrial).
-compile([export_all]).

display() ->
    spawn(fun() ->
		  receive
		      K -> io:format("~p~n",[K])
		  end
	  end).

actrial() ->
    spawn(fun() ->
		  receive
		      {0,K} ->
			  K ! 1;
		      {N,K} ->
			  actrial() !
			      {N-1,
			       spawn(
				 fun() -> receive
					      U -> K ! (N*U)
					  end
				 end)}
		  end
	  end).

test(N) ->
    actrial() ! {N,display()}.