Next: Lambda Expressions, Up: Functions [Contents][Index]
一般的な意味では関数とは引数(arguments)と呼ばれる与えられた入力値の計算を担うルールです。計算の結果は関数の値(value)、またはreturn値(return value)と呼ばれます。計算は変数の値やデータ構造の内容を変更する等の副作用をもつこともできます(Definition of side effectを参照)。純粋関数(pure function)とは、それらに加えて副作用をもたず、機種別やシステム状態のような外部要因とは無関係に同じ条件の引数にたいして常に同一の値をリターンする関数のことです。
ほとんどのコンピューター言語では、関数はそれぞれ名前をもちます。しかしLispでは厳密な意味において関数は名前をもちません。関数はオブジェクトであり、関数の名前の役割を果たすシンボルに関連づけることができますが(たとえばcar
)、それはオプションです。Function Namesを参照してください。関数が名前を与えられたとき、通常はそのシンボルを“関数”として参照します(たとえば関数car
のように参照する)。このマニュアルでは、関数名と関数オブジェクト自身との間の区別は通常は重要ではありませんが、それが意味をもつような場合には注記します。
スペシャルフォーム(special form)、マクロ(macro)と呼ばれる関数likeなオブジェクトがいくつかあり、それらも引数を受け取って計算を行います。しかし以下で説明するようにEmacs Lispではこれらは関数とはみなされません。
以下は関数と関数likeなオブジェクトにたいする重要な条件です:
Lispで記述された関数(厳密には関数オブジェクト)。これらについては以降のセクションで説明します。 Lambda Expressionsを参照のこと。
Lispから呼び出すことができるが実際にはCで記述されている。プリミティブはビルトイン関数(built-in
functions)とかサブルーチン(subr)のようにも呼ばれる。それらの例には関数likeなcar
やappend
が含まれる。加えてすべてのスペシャルフォーム(以下参照)もプリミティブとみなされる。
関数はLispの基礎となる部分(たとえばcar
)であり、オペレーティングシステムのサービスにたいして低レベルのインターフェースを与え、高速に実行される必要があるために、通常はプリミティブとして実装されている。Lispで定義された関数と異なり、プリミティブの修正や追加には、Cソースの変更とEmacsのリコンパイルが必要となる。Writing Emacs Primitivesを参照のこと。
プリミティブは関数と似ているが、すべての引数が通常の方法で評価されない。いくつかの引数だけが評価されるかもしれず、通常ではない順序で評価されるか、複数回評価されるかもしれない。プリミティブの例にはif
、and
、while
が含まれる。Special Formsを参照のこと。
あるLisp式をオリジナルの式のかわりに評価される別の式に変換する、関数とは別のLispで定義された構文。マクロはスペシャルフォームが行う一連のことを、Lispプログラマーが行うのを可能にする。Macrosを参照のこと。
プリミティブcommand-execute
を通じて呼び出すことができるオブジェクトで、通常はそのコマンドにバインドされたキーシーケンスをユーザーがタイプすることにより呼び出される。Interactive Callを参照のこと。コマンドは通常は関数である。その関数がLispで記述されていれば、関数の定義内のinteractive
フォームによってコマンドとなる(Defining Commandsを参照)。関数であるコマンドは他の関数と同様、Lisp式から呼び出すこともできる。
キーボードマクロ(文字列かベクター)は関数ではないが、これらもコマンドである。Keyboard Macrosを参照のこと。シンボルの関数セルにコマンドが含まれてれば、わたしたちはそのシンボルをコマンドと言う(Symbol Componentsを参照)。そのような名前つきコマンド(named command)はM-xで呼び出すことができる。
ラムダ式とよく似た関数オブジェクトだが、クロージャーはレキシカル変数バインディングの環境にも囲われている。Closuresを参照のこと。
バイトコンパイラーによりコンパイル済みの関数。Byte-Code Typeを参照のこと。
実際の関数のプレースホルダー。autoloadオブジェクトが呼び出されると、Emacsは実際の関数の定義を含むファイルをロードした後に実際の関数を呼び出す。Autoloadを参照のこと。
関数functionp
を使用して、あるオブジェクトが関数かどうかテストできます:
この関数はobjectが任意の種類の関数(funcall
に渡すことができる)ならt
をリターンする。functionp
は関数を名づけるシンボルにたいしてはt
、スペシャルフォームにたいしてはnil
をリターンすることに注意。
任意の関数が期待する引数の個数を調べることもできます:
この関数は指定されたfunctionの引数リストに関する情報を提供する。リターン値は(min . max)
という形式のコンスセル。ここでminは引数の最小個数、maxは引数の最大個数、または&rest
引数をもつ関数ではmany
、functionがスペシャルフォームならシンボルunevalled
。
以下のようにある状況下ではこの関数は不正確な結果をリターンすることに注意:
apply-partially
を使用して定義された関数(apply-partiallyを参照)。
advice-add
を使用して定義された関数(Advising Named Functionsを参照)。
functionp
と異なり、以下の3つの関数はシンボルをそれの関数定義としては扱いません。
この関数はobjectがビルトイン関数(たとえばLispプリミティブ)ならt
をリターンする。
(subrp 'message) ; message
はシンボルであり、
⇒ nil ; subrオブジェクトではない
(subrp (symbol-function 'message)) ⇒ t
この関数はobjectがバイトコード関数ならt
をリターンする。たとえば:
(byte-code-function-p (symbol-function 'next-line)) ⇒ t
これはfunc-arity
と同様だがシンボルインダイレクションなしのビルトイン関数にたいしてのみ機能する。非ビルトイン関数にたいしてはエラーをシグナルする。かわりにfunc-arity
の使用を推奨する。