2.6 Standard Modules and Manual Pagesから 2.9 Matching, Guards and Scope of Variables まで。
Getting Started With Erlangの続き。今日は2.6 Standard Modules and Manual Pagesから2.9 Matching, Guards and Scope of Variablesまで。
定義済みモジュール
「erl -man <モジュール名>」で定義済みモジュールの説明がみれるとのこと。早速やってみる。
>erl -man io -man not supported on Windows
...orz...Windowsではこっちを参照しましょう。→Manual Page Index
お、base64とかあるな。
1> base64:encode("test"). <<"dGVzdA==">>
ターミナルへの出力
io:format()を使うと便利です。
- io:format()はテンプレート文字列と置換データを受け取ってフォーマットした結果を出力します。
- テンプレート文字列中の"~w"は置換データに、"~n"は環境にあわせた改行になります。
- 戻り値としてokのAtomを返します。
3> io:format("~w is ~w years old.~n", [mii, 10]). mii is 10 years old. ok
文字列を置換データで渡すとListになったけど、こういうモノなのか?よく見ると上はアトムだ。
4> io:format("~w is ~w years old.~n", ["mii", 10]). [109,105,105] is 10 years old. ok
マッチングとガード条件
同じ名前で引数が同じ関数が複数定義された場合、引数の条件にそう関数が選択され、実行されます。(マッチング)また、マッチする条件を指定することができます。(ガード条件)
- 同じ名前で引数が同じ関数がある場合、"."(終わり)でなく";"(まだある)でつなげて書きます。
- ガード条件は「<関数名>(<引数>..) when <ガード条件> -> ...」の形式で記述します。
- ガード条件では演算子が使えます。
以下は、配列の最小値を表示するサンプルです。呼び出し順がわかるようにメソッドの呼び出し前に出力を追加してみました。
-module(find_min). -export([find_min/1]). % 配列中の最小値を表示する。 find_min( [HEAD|REST] ) -> find_min( REST, HEAD ). find_min( [], MIN ) -> % 配列が空になったら処理を終了 io:format("a:~w~n",[MIN]), % 処理がまだ続く場合","で区切る。 MIN; find_min( [HEAD|REST], MIN ) when HEAD < MIN -> % 残配列の先頭の方が小さい場合、この処理を実行 io:format("b:~w,~w ~n",[HEAD, MIN]), find_min( REST, HEAD ); find_min( [HEAD|REST], MIN ) -> % そうでない場合この処理を実行 io:format("c:~w,~w ~n",[HEAD, MIN]), find_min( REST, MIN ).
実行結果です。
5> find_min:find_min([3,7,2,0,15,-3,13,1]). c:7,3 b:2,3 b:0,2 c:15,0 b:-3,0 c:13,-3 c:1,-3 a:-3 -3
変数のスコープ
変数はすべて関数内のローカルスコープです。
- 関数が実行されると生成され、終わると破棄される。
- また、変数には値を再代入できない。(変数というより定数。)