トップ «前の日記(2007-05-01) 最新 次の日記(2007-05-03)» 編集

Route 477



2007-05-02

[erlang] Erlang触ってみた

NコアのプロセッサならN倍速く動くというフレーズに釣られてErlang触ってみた。

Debianだとapt-get install erlang でインタプリタが入る。超簡単。

参考文献は以下のような感じ。

「!」でメッセージ送信ってのはπ計算を思い出すな。

reverseはこんな感じ (kmonos.netより)

reverse(List) ->
        case List of
                []          -> [];
                [Head|Tail] -> reverse(Tail) ++ [Head]
        end.

いかにも関数型っぽい。HaskellとかOCamlを知らない人は面食らうだろうなぁ。

ついでなんで文中にある「[|]だけのreverse」を実装してみた。

sample.erl:

-module(sample).
-export([reverse/1, revs/1]).

reverse(List) ->
        case List of
                []          -> [];
                [Head|Tail] -> reverse(Tail) ++ [Head]
        end.

rev(List, Rest) ->
        case Rest of
                []          -> List;
                [Head|Tail] -> rev([Head|List], Tail)
        end.

revs(List) -> rev([], List).

erlで起動。sample.erlを読み込んでみる。

yhara@meteor:~/src/erlang % erl
Erlang (BEAM) emulator version 5.5.2 [source] [64-bit] [async-threads:0] [kernel-poll:false]

Eshell V5.5.2  (abort with ^G)
1> c(sample).
{ok,sample}

とりあえずreverse。

2> reverse([1,2,3]).

=ERROR REPORT==== 3-May-2007::02:17:18 ===
Error in process <0.30.0> with exit value: {undef,[{shell_default,reverse,[[1,2,3]]},{erl_eval,do_apply,5},{shell,exprs,6},{shell,eval_loop,3}]}

** exited: {undef,[{shell_default,reverse,[[1,2,3]]},
                   {erl_eval,do_apply,5},
                   {shell,exprs,6},
                   {shell,eval_loop,3}]} **

エラーメッセージが絶望的に意味不明だが、「{undef,」の部分から未定義変数のなんからしいと分かる。

そうか、モジュールを指定しないと。

3> sample:reverse([1,2,3]).
[3,2,1]

こうね。

4> sample:revs([1,2,3]).
[3,2,1]
5>

うまく動いているようだ。

SDLバインディングもあるので(esdl) ゲームも作れる模様。 全てのキャラが並列に動作するゲームとか格好よくね!?

[erlang] SPOJに入ってないと思ったけどanagolにあるのか

新しい言語覚えたいけど何書いたらわからん〜って時はonline judgeはいいよね。 動作が合ってるかどうか自動で判定してくれるし。