Erlang

今日は仕事をサボってもなんか問題なさげなので。

ちまたで話題のErlangをこっそりと触ってみる。
この前の千葉先生の話を聞いて以来、並列分散という言葉に弱いのだ。

とりあえず、ここを見てお勉強だ。
http://www.erlang.org/doc/getting_started/part_frame.html

プロセスを2個立ち上げて文字を表示する。

-module(tut14).
-export([start/0, say_something/2]).

say_something(_, 0) ->
  done
;
say_something(What, Times) ->
  io:format("~p ~w~n", [What, Times]),
  say_something(What, Times -1)
.

start() ->
  spawn(tut14, say_something, [{hello, name, {hoge, fuga}}, 3]),
  spawn(tut14, say_something, [{goodbye, my}, 3])

複数ノード間の通信

-module(tut17).
-export([start_ping/1, start_pong/0, ping/2, pong/0]).

ping(0, Pong_Node) ->
  {pong, Pong_Node} ! finished,
  io:format("Ping finished~n", [])
;
ping(N, Pong_Node) ->
  {pong, Pong_Node} ! {ping, self()},
  receive
    pong ->
      io:format("Ping received pong~n", [])
  end,
  ping(N - 1, Pong_Node)
.

pong() ->
  receive
    finished ->
      io:format("Pong finished~n", []);
    {ping, Ping_PID} ->
      io:format("Pong recieved ping~n", []),
      Ping_PID ! pong,
      pong()
  end
.

start_pong() ->
  register(pong, spawn(tut17, pong, []))
.

start_ping(Pong_Node) ->
  spawn(tut17, ping, [3, Pong_Node])
.

上のコードは以下のように実行する。

Pong側
$ erl -sname pong
> tut17:start_pong().

Ping側
$erl -sname ping
$ erl -sname ping
> tut17:start_ping(pong@myserver).

Pong_Nodeの部分がサーバ(Erlangだとノードと呼ぶ)を示す部分。