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})

    atom_to_list(an_atom)

    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

http://www.erlang.org/course/sequential_programming.html