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>