口で言うより行うことがErlang習得への近道と信じています。
Erlangの関数
大きく分けて3種類あります。
- モジュールに定義された関数
- Erlangビルトイン関数(BIFs)
- 無名関数
モジュールに定義された関数
- 基本的に
Module:Function(Arguments)
という形で呼び出す - モジュール内の関数、及び明示的にインポートされた関数は、モジュール名を省略して呼び出せる
一例としてio
モジュールのformat/2
関数を呼び出してみます。
> io:format(["闘魂", $\n]).
闘魂
ok
関数を宣言する方法
- 関数はセミコロン(
;
)で区切られ、ピリオド(.
)で終端する一連の関数節で構成される - 関数節は節頭と節胴体からなり,
->
で区切られる - 節頭は,関数名(アトム)、引数リスト(パターン)および
when
で始まるガードからなる - 節胴体はカンマ(
,
)で区切られた一連の式で構成される
関数名(引数パターン1) [when ガード1] ->
式11,
式12;
関数名(引数パターンN) [when ガードN] ->
式N1,
式N2.
一例として階乗の関数は以下のように宣言します。
fact(N) when N > 0 -> % 第一節 頭
N * fact(N - 1); % 第一節 胴体
% 節は「;」で区切る
fact(0) -> % 第二節 頭
1. % 第二節 胴体
% 終端は「.」
Erlangビルトイン関数(BIFs)
-
erlang
モジュールに属している - 他の関数と違って、自動的にインポートされる
% モジュール名を省略できる
> hd([1, 2 ,3]).
1
% モジュール名を明示してもOK
> erlang:hd([1, 2 ,3]).
1
無名関数
-
fun ... end
式で定義すること以外は、モジュールで定義する場合と同じ書き方 - 変数に束縛して使用可能
まずは簡単なやつで練習してみます。
> Aisatsu = fun () -> io:put_chars("元気ですかーーーーッ!\n") end.
> Aisatsu().
元気ですかーーーーッ!
ok
階乗は無名関数で書くとこんな感じになります。再帰処理をするには引数に関数自身を渡す必要があります。
Fact = fun
(Fact, N) when N > 0 -> % 第一節 頭
N * Fact(Fact, N - 1); % 第一節 胴体
% 節は「;」で区切る
(Fact, 0) -> % 第二節 頭
1 % 第二節 胴体
end. % 終端は「.」
> Fact(Fact, 2).
2
> Fact(Fact, 3).
6
> Fact(Fact, 4).
24
無名関数の中で無名関数を書くこともできます。
Factorial = fun (Number) ->
Fun = fun
(F, N) when N > 0 -> N * F(F, N - 1);
(F, 0) -> 1
end, % 節胴体の式はカンマで区切る
Fun(Fun, Number)
end.
Module:Name/Arity記法
Module:Name/Arity
記法を使ってモジュールに定義された関数と同じ振る舞いをする無名関数を生成することができます。
> MyFormat = fun io:format/2.
fun io:format/2
> MyFormat("~ts~n",["闘魂"]).
闘魂
ok
Elixirにも挑戦したい
闘魂ElixirシリーズとElixir Schoolがオススメです。