この節では関数の利用の仕方と、標準ライブラリ及びBIFについて扱います。
関数とは「ある定まった手続き」のことです。
"関数を呼び出す側"が関数に仕事を依頼するという形での利用となります。
関数を利用することによって、同じ処理を何度も書かなくて良くなったり、手続きを分離することで プログラミング自体が楽になったりします。
この関数はモジュールの中に入っています。
細かいことは「モジュールと関数」という章で扱いますが、簡単に両者の関係を記しておきます。
関数は先ほど話したように「処理のまとまり」と呼べます。
それに対して、モジュールは"複数の関数をまとめるための入れ物"のようなものです。
イメージとしては以下のようになります。
モジュール1
関数1
関数2
関数3
モジュール2
関数1
関数2
「モジュール1の関数1」を利用。「モジュール2の関数2」を利用。
という具合で、モジュールと関数を指定することにより利用する関数を特定します。
関数の呼び出し方は以下のようになっています。
モジュール名:関数名(引数)
モジュール名と関数名を符号 : で繋いで、その後ろに引数群を書くのです。引数とは関数に渡す値のことです。 引数の数は関数によって異なり、引数同士は , でスペースを開けます。
少し例を見てみます。 mymodule というモジュールに myfunction1 という関数があるとします。
このmyfunction1は引数を2つとるとしましょう。
これは以下のように呼び出します。
mymodule:myfunction1(Var1, Var2)
関数名の後ろについている「 (Var1, Var2) 」の中にある、Var1とVar2が引数です。 ちなみにVarはvariable(変数)の略です。
実際に存在する関数の呼び出しサンプルは、次の項目「BIF」で扱います。
Erlangにはシステムより提供されている備え付けの関数があります。これらの関数群を標準ライブラリと呼びます。
BIF(Built in Function 組み込み関数)とはErlangに備わっている組み込み関数群のことです。
これは純粋なErlang言語による関数ではなく、他の言語(C)を使って作成されたものです。
標準ライブラリ、BIFを利用する利点は以下の通りです。
最後の利点はBIFがErlang以外の言語を利用しているためです。高速な動作が求められる部分を Cなどで記述しているため、Erlangの苦手な処理(計算など)も高速に行なえます。
ライブラリを利用してみます。ここではlistsモジュールにある関数を使って リストを操作してみます。
> List = [1,2,3,4,5].
[1,2,3,4,5]
> List2 = lists:reverse(List).
[5,4,3,2,1]
lists:reverse(List) がBIFを呼び出している部分です。 リストの反転処理を行なっていますね。
上の例ではlistsがモジュール名、reverseが関数名、(List)が引数です。 引数として List を渡しています。
引数を2つとるタイプの関数を使ってみます。erlangモジュールのappend_elementという関数を使います。
> erlang:append_element({one, two}, three).
{one,two,three}
また、関数の呼び出しを行なう関数(関数apply())も存在します。
よく使われるので覚えておいて下さい。
なお、この例でモジュールを指定していないのは、すでにモジュールがインポートされているからです。
apply(Module, Function, Args)
モジュールModuleの関数Functionを実行する。
引数はArgsであり、これはListです。
> apply(lists, reverse, [[a, b, c]]).
[c,b,a]
> apply(erlang, atom_to_list, ['Erlang']).
"Erlang"
実はモジュール名を指定しなくても利用できる関数があります。
それは以下の3タイプです。
関数は、「自分が含まれるモジュール」にある別の関数をモジュール指定をせずに呼び出すことができます
インポートについては、「モジュールの属性」の節を参照下さい。
自動インポートとは、Erlangのシステムがインポートしている関数のことです。 自動インポートされるのは、「erlangモジュール」などの一部の関数です。 erlanモジュールの中にも自動インポートされていない関数もあります。