Erlang World


top > first step > function and bif

Function and BIF

関数とは何か

この節では関数の利用の仕方と、標準ライブラリ及び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」で扱います。

標準ライブラリ 及び 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モジュールの中にも自動インポートされていない関数もあります。


Yuichi ITO. All rights reserved.
mail to : ad
inserted by FC2 system