Elixir in Action、Programming ElixirやGetting Startedなんかとは趣が異なって、BEAM VM上で動作するElixirという仕組みを色々深堀しているのですね。説明していること自体はかぶる箇所が多々あるのですが、より言語自体というよりも、その言語によって何を成すか?という目的に対してこの機能がある、といった感じで話が進んでいる感じ。
ところどころ、Erlang混じりの解説やリンクが登場するのはErlangを専門とする著者だから、の特徴かな。これ読んでいると、Erlangの言語的な表記というよりは、内部処理の知見もたまってくるという。
少し読んだところの特徴を抜粋。個人的なメモです。
- Elixirは、moduleとfunctionに分けられる
- Elixirは純粋な関数型言語ではない。そのため、幾つか副作用がある関数が存在する。
- データはimmutable。加工したデータは、異なるmemory locationに書き出される。ただし、shallow copyされたデータは共通の元となるデータをなるべく共有している。
- booleanは
trueとfalseのatom - nullabilityは無いので、
nilのatomを使う - String typeは無い。binariesかlistで使う。
- character listは、3-rd party製のErlangなんかが要求する時のみに使うことが良い。あとはbinary string使いましょう。
- complex typeはlist、tuple、mapsだけ
- Range、Keyword list、HashDict、HashSetはデータシステムの元
- keyword-listは値の小さな構造体で使う
- HashDictは、より大きなコレクションで性能を上げたい時に使おう
- HashSetはユニークな値の集合
- & オペレータでlambdaを使おう
- Getting started では、
fn x -> function endを簡略化するために & を使ってましたね
- Getting started では、
粒度が結構違うメモなのですが、Elixirでの命名規則は以下の模様。
Elixirでの命名規則としての ?、!
?: true or false のatomを返す!: これを付ける場合、runtime errorをraiseする- 例えば、EctoなんかでNotFoundの場合、
!なしだとnilが返ってくるけれど、!ありだとErrorがraiseされますね。確かにそうですね。ふむふむ。
- 例えば、EctoなんかでNotFoundの場合、
&の利用
以下を、
lambda = fn(x, y, z) -> X * y + z end
&を使うと…
lambda = &(&1 * &2 + &3)
ついでにRangeを使うと、例えば
case n do n in 1..3 -> lambda.(2, 3, 4) |> IO.puts end
と書くと 10 が出力される、となります。
ElixirやErlangといった今まで自分が知らなかった領域を知って、それが実世界でどのように価値を提供しているかというところまで繋がっていくって、純粋に面白いですね。
8月25日にShibuya.exがあるようなので、Elixirの基礎的な書籍はざっとなめて参加してみよう。
1 Comment