Elixir自体に慣れようと、Get startedをなめてみました。Elixir 1.0.4がリリースされた頃のものです。以下はメモがてら、です。
http://elixir-lang.org/getting-started/introduction.html
すごくDocumentが整備されている感がありました。
特に繰り返しでは再起を使うというRecursionの説明があったあと、それを容易にするための Enum を提供しててその機能に関する説明、 Stream の話もという形で頭にストーリーを植え付けながら内容を理解できる感じです。
以下、ちょっとメモです。
Modules
http://elixir-lang.org/getting-started/modules.html
$ elixirc example.ex
でコンパルしたとき、
$ iex
を実行したディレクトリと同じディレクトリにコンパイルしたものがあれば、自動的に読み込まれてりようできるもよう。
$ elixir math.exs
はスクリプトとして実行される。
defmodule Math do
def sum(a, b) do
do_sum(a, b)
end
defp do_sum(a, b) do
a + b
end
end
Math.sum(1, 2) #=> 3
Math.do_sum(1, 2) #=> ** (UndefinedFunctionError
defpは、同一モジュール内からのみ呼ぶことが可能なprivateなモジュール。なるほど。継承とかどうなのかな。(まだそこらへんは読んでない。 defoverridable で提供されているらしい?めも)
Recursion
http://elixir-lang.org/getting-started/recursion.html
再起でforを実現するのは関数型っぽくて頭になじまないと厳しそう。ただ、ここら辺は大学とか含めて数学的な素養を学んだ人からすると、慣れるまでに時間もかからなさそう。数列の世界の話みたいなものですしね。
defmodule Recursion do
def print_multiple_times(msg, n) when n <= 1 do
IO.puts msg
end
def print_multiple_times(msg, n) do
IO.puts msg
print_multiple_times(msg, n - 1)
end
end
Recursion.print_multiple_times("Hello!", 3)
# Hello!
# Hello!
# Hello!
Enum のライブラリにいくつかあらかじめライブラリが用意されているので、それは便利。ちょうど次の章で説明されていた。
http://elixir-lang.org/getting-started/enumerables-and-streams.html
EnumとStreamを比較しながら話が進んでいて、StreamはLazyというところが違うと書いていた。
Enumは常にEnumの実際の値を返すけれど、Streamは必要なときに実際の値を返すがそれまではStreamとして保持している、と。
Pipeoperatorの対比を見ればおおー、なるほどという感じだった。
Pipeoperatorのときは基本Stream使っていって、lazinessが必要な大きなデータを扱うようなときとかコレクションを使ったりするときはEnumを使っておけば良い、という感じかな。
チュートリアルでの最後の締めは以下。
The amount of functions and functionality in Enum and Stream modules can be daunting at first but you will get familiar with them case by case. In particular, focus on the Enum module first and only move to Stream for the particular scenarios where laziness is required to either deal with slow resources or large, possibly infinite, collections.
次は Processes から。