2008-07-04 [長年日記]
λ. Erlangでリファレンスを実装
Erlangの並行処理は最低限以下の三つを知っていれば使えるようだ。
- プロセスの生成 Pid = spawn(Fun)
- メッセージの送信 Pid ! Message
- メッセージの受信 receive Pattern1 -> Expression1; Pattern2 -> Expression; ... end
これはちょー簡単で良さそうですな。 ということで、まずは試しに変更可能なリファレンスを作ってみた。
-module(ref).
-export([new/1, get/1, set/2]).
new(Val) ->
{ref, spawn(fun () -> loop(Val) end)}.
loop(Val) ->
receive
{From, get} -> From!{self(), Val}, loop(Val);
{set, NewVal} -> loop(NewVal)
end.
get({ref, Pid}) ->
Pid!{self(), get},
receive
{Pid, V} -> V
end.
set({ref, Pid}, Val) -> Pid!{set, Val}, true.
使ってみると、ちゃんと変更可能なリファレンスとして振舞ってくれる。やった!
% erl
Eshell V5.6.3 (abort with ^G)
1> c(ref).
{ok,ref}
2> X=ref:new(1).
{ref,<0.46.0>}
3> ref:get(X).
1
4> ref:set(X, 2).
true
5> ref:get(X).
2
6>
[ツッコミを入れる]
