Re:Start

いまはディレクターやってます

関数大事だよー 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 )