Keep on moving

あんまりまとまってないことを書きますよ

Erlang 基礎勉強会に参加させていただいてきた

2009/12/28に第一回 Erlang 基礎勉強会 : ATNDに参加させて頂いてきました。
主催のid:cooldaemonさんありがとうございました。
Erlangの使われ方、逐次処理での勘所をcooldaemonさんに教えていただけてかなり勉強になりました。
軽くまとめておきます。

主な内容

↓cooldaemonさんのスライドに従って進行しました。
Basic Study for Erlang #1

手続き型言語のプログラム経験を、ある程度お持ちの方を対象に Erlang の基礎勉強会を開きます。
第一回は、疎かにされがちなリスト処理の概念などを一緒に考えていく事を検討しています。


スライドに出てくるサンプルは↓
http://github.com/cooldaemon/BasicStudyForErlang
※演習の答えもあるので注意!

雑多にとったメモ

  • ErlangとOTPはほぼ不可分。OTPを行うための言語と考えてよい。
  • Erlangはノード間通信をTCP/IPで行う。(UDPのモジュールもあるとのこと)
  • cooldaemonさんによるKAIの解説記事。未チェックでした。
  • erlコマンドはノード,シェルを立ち上げている
    • 1ノード = 1VM
  • WindowsのコマンドプロンプトからJCLモードに入ろうとしても入れない。(Ctr+Gはビープ音に割り当てられているため)
    • JCLを使うときはerl.exeを実行するべき

スライドでの実習課題

一応全部解いてみた。一応仕様は満たしてるけど細かいところはまだ実装しきれてません。

-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でクロージャまで学ぶでも可)を流し読みしておくとさらに理解が深まると思います。