Get start Elixir vol 2

processのところから、protocolのところまで。

processの話の中で、以下の文言がありました。

Process and links play an important role when building fault-tolerant systems. In Elixir applications, we often link our processes to supervisors which will detect when a process dies and start a new process in its place. This is only possible because processes are isolated and don’t share anything by default. And if processes are isolated, there is no way a failure in a process will crash or corrupt the state of another.

While other languages would require us to catch/handle exceptions, in Elixir we are actually fine with letting processes fail because we expect supervisors to properly restart our systems. “Failing fast” is a common philosophy when writing Elixir software!

Elixirというか、Erlang VMの目指しているものが見えますね。こういう言語の設計思想をチュートリアルで学べるのは良いですね。ふむふむ。

processの話で、

spawn
Task.start

spawn_link
Task.start_link

の差は、processがerrorを出した時、そのprocessを終了させるかどうか。linkしている場合、終了しますがしていない場合はprocessが起動しっぱなしです。これはProcess.linkでも取得できる模様。

A :name option could also be given to Agent.start_link/2 and it would be automatically registered. Besides agents, Elixir provides an API for building generic servers (called GenServer), generic event managers and event handlers (called GenEvent), tasks and more, all powered by processes underneath. Those, along with supervision trees, will be explored with more detail in the Mix and OTP guide which will build a complete Elixir application from start to finish.

少し読んだらピンとくるのですが、processに状態をもたせるわけですね。なので、それ用にAgentというAPIが提供されてます。その中身の簡単な説明も書かれてるのですが、processに対して値を与えたり、得たりをするさまがわかります。なるほどな。

Fileなどの:okや:errorを分けるのはcase文。結果の処理を分岐させる場合、以下のような書き方になります。

case File.read(file) do
  {:ok, body}      -> # do something with the `body`
  {:error, reason} -> # handle the error caused by `reason`
end

IO.moduleはprocessのように動作するらしいですね。
Erlang VM、同じネットワークで異なるノード間でファイルプロセスを交換、どちらのノードでもファイルを読み書きできます。group leaderと呼ばれる特別なノードがあり、そのノードで表示されたメッセージはリダイレクトされ、リクエストする先の端末で表示されることが保証されるとか。process間の通信を主眼に置いているErlangの設計なだけあって、process/ネットワークに大差なく、それらが通信として扱われる思想の模様。

ErlangがEricssonが使うような高信頼性の必要なネットワーク機器で使われているように、このようなノード間通信を前提に置かれた設計、分散コンピューティングの環境ではとても相性よさそう。

> IO.puts Process.group_leader, "hello"

annotationのサポートで、

@moduledoc
@doc

をサポートするの良いですね。

あと、ここが範囲ではないのですが、 do...end block を、以下のように圧縮して書くことが頭に馴染んできましたね。慣れると簡潔にかけて良いですね。

def hoge?(neko), do: fuga

Elixirのfalseやnilの扱いに関して、

In Elixir, only false and nil are treated as false. Everything else evaluates to true.

らしいです。一方で、blank?なんかが必要なアプリもあります。その場合、blank?を実装するのですが、その方法としてdefprotocolの説明がありました。その実装は、defimpleで定義され、特定のdecmoduleにより定義された対象にできる模様。また、@fallback_to_anyを定義することで、defimplで個別に定義しているもの以外をまるっと扱える処理を定義できるのが何気に優しい。
※http://elixir-lang.org/getting-started/protocols.html

まだチュートリアルも半分だけれど、だんだんとElixirの書き方が頭に入ってきた感じがする。ざっとチュートリアル終えたら、exicism.ioやったり、PhoenixとAndroid/iOSアプリ作ってもう少し慣れよう。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中