すごいErlang ch.18までやった

なんとなくクセのあるErlangが好きになって、年末はいろいろ試行しながらやってた。

とりあえず、gen_server, gen_event, gen_fsm, supervisorをかっさらって、基礎の部分をスクラッチで書いてみて、gen_??がどのような挙動をするのかわかった。

超基本的には、
module:wrapper -> gen_server:call(Pid, Msg) -> module:handle_call(Msg, {FromPid, Ref}, State)
でmodule:wrapperをpublic APIとして公開し、gen_server:call/2をコールし、module:handle_callをprivate functionとして要件に合うように実装すればよろしい。

つまり、loopの部分(gen_fsmの場合はstateName(function))はgen_??が実装してくれているから、loop関数のreceive内部の挙動のみをmodule:handle_callで自作実装すれば良いんだな、ってことがわかった。

開始とか終了も同じく。

module:wrap_start_link -> gen_server:start_link({local, Name}, ?MODULE, Args, DebugOption) -> (module:init(TriggerState) => InitialState)
でmodule:wrap_start_linkをpublic APIとして公開し、module:init(TriggerState)をprivate functionとして実装すれば良い。

OTPの使い方はコツがわかれば、ch.18のthreading poolの部分は意外と難しくない...
ch.19~21まではプログラミングってよりコンパイル周りの手続きなので、電車とかで読も!

本当は12月中にch.22 Process Questまでやりたかったんだけど、この先はゆっくりとやっていきますか...