トップ «前の日記(2008-07-03) 最新 次の日記(2008-07-05)» 月表示 編集

日々の流転


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> 
Tags: Erlang