2008年5月7日水曜日

erlangはじめました。

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ちまたではやっている?らしいerlangを触ってみました。前回のpostでpythonのecho serverを作ったので、こんどはerlangでも作ってみたいと思います。

いきなりメモ:(後日整理するかも?)

erl$ code:get_path().



ipython$ sys.path

と多分同じ。モジュールの検索パスが表示される。

[Car|Cdr]
なのだ!
7. car, cdr, cons:基本関数 @ lispを参照のこと。


pythonで、

hoge, piyo = some_sequence

と書くと、some_sequenceが分解される、(hoge, piyo)か、[hoge, piyo]の場合ね。

これをもっと推し進めたようなこと(パターンマッチという)ができて、

erl${X, Y, Z} = {222, def, "cat"}.
{222, def, "cat"}

とかすると、

erl$X.
222

となる。
この機能によって階層を作れる。(Cでの構造体みたいなもの、ただ、名前をつけなくていいし、フィールドに名前も不要。というか名前がついてしまうと、参照透過性の兼ね合いからよくないのだろう。)

コテコテの関数言語であるのは

-module(mylists).
-export([sum/1]).
sum([H|T]) -> H + sum(T);
sum([]) -> 0.

からもよくわかる。
この内容をfileとしてmylists.erlとしてcwdにセーブしたら

erl$ c(mylists).
{ok,mylists}

となり、コンパイルができるはず。んで、

erl$ L = [1, 3, 10].
[1,3,10]
erl$ mylists:sum(L).
14
erl$

とかできる。
myを打ったところで、tabを押すとlists:が補完され、さらにtabを打つとsum(が補完される。erlのシェルがmoduleについて知っているからに他ならない。この辺の使い勝手はipythonと大してかわらない。まあ?はないだろうけど、それに類似した機能拡張はできるか存在する貸しているはず。そのうち探そう。


-module(mylists).
-export([sum/1, map/2]).
sum([H|T]) -> H + sum(T);
sum([]) -> 0.

map(_, []) -> [];
map(F, [H|T]) -> [F(H) | map(F, T)].

二つの関数を1つのファイルに書くとこうなる。exportの構文ダサい気が・・・。

1 件のコメント:

nori さんのコメント...

あたりまえだが、すでに作った人がいる。このへん?