2009/12/28に第一回 Erlang 基礎勉強会 : ATNDに参加させて頂いてきました。
主催のid:cooldaemonさんありがとうございました。
Erlangの使われ方、逐次処理での勘所をcooldaemonさんに教えていただけてかなり勉強になりました。
軽くまとめておきます。
主な内容
↓cooldaemonさんのスライドに従って進行しました。
Basic Study for Erlang #1
手続き型言語のプログラム経験を、ある程度お持ちの方を対象に Erlang の基礎勉強会を開きます。 第一回は、疎かにされがちなリスト処理の概念などを一緒に考えていく事を検討しています。
スライドに出てくるサンプルは↓
http://github.com/cooldaemon/BasicStudyForErlang
※演習の答えもあるので注意!
雑多にとったメモ
スライドでの実習課題
一応全部解いてみた。一応仕様は満たしてるけど細かいところはまだ実装しきれてません。
-module(test). %% Exported Functions -export([seq/2,seq/3]). -export([foldl/3,foldr/3]). -export([filterl/2,filterr/2]). % Include files -include_lib("eunit/include/eunit.hrl"). %% -------------------------------------------------------------------- %% Test Functions %% -------------------------------------------------------------------- seq_test_() -> [ ?_assertEqual(seq(1,10),lists:seq(1,10)) ]. foldl_test_() -> [ ?_assertEqual(foldl(fun(E,AccIn) -> AccIn - E end, 1, [2,3,4]),-8) ]. foldr_test_() -> [ ?_assertEqual(foldr(fun(E,AccIn) -> AccIn - E end, 4, [1,2,3]),-2) ]. filterl_test_() -> [ ?_assertEqual(filterl(fun(A)-> (A rem 2) =:= 1 end,[1,2,3,4]),[1,3]) ]. filterr_test_() -> [ ?_assertEqual(filterr(fun(A)-> (A rem 2) =:= 1 end,[1,2,3,4]),[1,3]) ]. % seq/2 seq(X,Y) when X =< Y -> seq(X,Y,1); seq(X,_Y) when X =:= (_Y + 1) -> []. % seq/3 seq(X,Y,Z) when X =< Y -> [X|seq(X+Z,Y,Z)]; seq(X, _Y, _Z) when X =< (_Y + _Z) -> []. % foldl foldl(_F, Acc, []) -> Acc; foldl(F, Acc, [X|Xs]) -> foldl(F, F(X, Acc), Xs). % foldr foldr(_F,Acc,[]) -> Acc; foldr(F,Acc,[X|Xs]) -> F(X,foldr(F, Acc, Xs)). % lists:filter/2 を foldlで定義 filterl(F,L) -> lists:reverse( foldl( fun(E,AccIn) -> case F(E) of true -> [E|AccIn]; false -> AccIn end end , [], L)). % lists:filter/2 を foldrで定義 filterr(F,L) -> foldr( fun(E,AccIn) -> case F(E) of true -> [E|AccIn]; false -> AccIn end end , [], L).
参加者として反省点
- 環境の設定は必要
- MacではPC名が127.0.0.1に割り振られていないので、「JCLで他ノードのシェルにリモート接続」の実習に手間取り時間を圧迫してしまった。
- 参加前に/etc/hostsで設定して置く必要があった。
- 参加者が思いついたタイミングで細かくcooldaemonさんに質問したけど、なるべく節目でした方が良かった。進行が悪くなるので。
まとめ
※同じ内容で、何回か行なう予定です
とのことなので、興味のある方は是非参加するのをおすすめします。
参加する前にLisp,Haskellなど(JavaScriptでクロージャまで学ぶでも可)を流し読みしておくとさらに理解が深まると思います。