関数大事だよー 1/2
第5章ファンクション (ifの前まで)
http://www.ymotongpoo.com/works/lyse-ja/ja/05_syntax_in_functions.html
基本的な形
functions.erl
-module(functions). -compile(export_all). function(X) -> Expression; function(Y) -> Expression; function(_) -> Expression.
- 簡単なフォーマット文
greet(male, Name) -> % 関数節はセミコロン(;)で区切られる io:format("Hello, Mr. ~s", [Name]); greet(female, Name) -> io:format("Hello, Mrs. ~s", [Name]); greet(_, Name) -> % 最後にだけピリオドを付ける io:format("Hello, ~s!", [Name]).
- リストを使った関数など
% リストの1番目を返す head([H|_]) -> H. % リストの2番目を返す second([_,X|_]) -> X. same(X,X) -> true; same(_,_) -> false.
- はじめに引数がXに代入されて、次のXは、代入されたXとの比較になる。ここで違えば、falseのほうになるというわけです。
% 時間がどうではなく、パターンマッチしていれば何でも通してしまう valid_time({Date = {Y,M,D}, Time={H,Min,S}}) -> io:format("The Date tuple(~p) says today is: ~p/~p/~p, ~n", [Date,Y,M,D]), io:format("The time tuple(~p) indicates: ~p:~p:~p. ~n", [Time,H,Min,S]); valid_time(_) -> io:format("Stop feeding me wrong data!").
- 引数が、{ {123,3,4}, {20,3,4} } と、いうような形であれば、何でも通してしまう。
ガード
- これは条件分岐となぜ言わないのかわからないけどw
old_enough(X) when X >= 16 -> true; old_enough(_) -> false. % カンマはandalso right_age(X) when X >= 16, X =< 104 -> true; right_age(_) -> false. % セミコロンはorelse wrong_age(X) when X < 16; X > 104 -> true; wrong_age(_) -> false.
- カンマやセミコロンはandalsoやorelseとして使えるけれど、各条件文の中でエラーが出た場合、前者はたとえエラーが出たとしても条件分岐を終えるのに対し、後者は、エラーが出たらそこでおしまい。
- 入れ子に定義する事は、andalsoやorelseだけ有効。
( (A andalso B) orelse C )