Eralng Course: Module 2 - Sequential Programming (中編)
関数呼出(Function Calls)
関数名はアトムのルールに沿っている必要がある
コロン区切りでモジュール名を前置。
引数にはErlangのあらゆるデータ構造が入る。
module:func(Arg1, Arg2, ... Argn)
func(Arg1, Arg2, .. Argn)
引数の数が異なる関数は別の関数として扱われる(Prolog的)。
なので関数を文書に表記するときは、
somefunc/3 などと "/"のあとに引数の数をつけて示す。
関数記法 ( Function Syntax )
まだ条件があるときは ";" 、最後の条件は "." で終端する。
評価は上から順に行われる(バックトラックしない)。
ボディ部も前から順に呼び出される。
func(Pattern1, Pattern2, ...) ->
... ;
func(Pattern1, Pattern2, ...) ->
... ;
...
func(Pattern1, Pattern2, ...) ->
... .
※引数の数が違う同名の定義は、別関数と認識される。
ガードされた関数 (Guarded Function Clauses)
whenを使って関数に条件式をつけられる(ガード)
変数は全て束縛済み(代入済み)である必要がある
factorial(0) -> 1;
factorial(N) when N > 0 ->
N * factorial(N - 1).
完全にガードすると、関数定義は順番に依存しなくなる
factorial(N) when N > 0 ->
N * factorial(N - 1);
factorial(0) -> 1.
※上は、第1の例と同じ意味で、下の例とは違う。
factorial(N) ->
N * factorial(N - 1);
factorial(0) -> 1.
モジュール システム(Module System)
-moduleでモジュール名定義。
-exportで関数公開。
-module(demo).
-export([double/1]).
double(X) ->
times(X, 2).
times(X, N) ->
X * N.
※この場合、double/1 はモジュール外から
アクセスできるが、times/2 はだめ
ビルトイン関数 (Built In Functions / BIFs)
処理系に入っている関数。詳細はマニュアル嫁。
date()
time()
length([1,2,3,4,5])
size({a,b,c})
list_to_tuple([1,2,3,4])
integer_to_list(2234)
tuple_to_list({})
ガードの例 (Examples of Guards)
number(X) - Xは数字(Number
integer(X) - Xは整数
float(X) - Xは浮動小数点数
atom(X) - Xはアトム
tuple(X) - Xはタプル
list(X) - Xはリスト
length(X) == 3 - リストXの要素数は3
size(X) == 2 - タプルXのサイズは2
X > Y + Z - X > Y + Z
X == Y - X は Y と等しい
X =:= Y - X は Y と厳密に等しい
※ 1 == 1.0 は成功、 1=:=1.0 は失敗
- - -
Eralng Course: Module 2 - Sequential Programming