Next: Lambda Expressions, Up: Functions [Contents][Index]
一般的な意味では、関数とは引数(arguments)と呼ばれる与えられた入力値の計算を担うルールです。計算の結果は、その関数の値(value)、またはreturn値(return value)と呼ばれます。計算は、変数の値やデータ構造の内容を変更する等の副作用をもつこともできます。
ほとんどのコンピューター言語では、関数はそれぞれ名前をもちます。しかし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
をreturnします。functionp
は関数を名づけるシンボルにたいしてはt
、スペシャルフォームにたいしてはnil
をreturnすることに注意してください。
functionp
とは異なり、以下の3つの関数は、シンボルをそれの関数定義としては扱いません。
この関数は、objectがビルトイン関数(たとえばLispプリミティブ)の場合は、t
をreturnします。
(subrp 'message) ; message
はシンボルであり、
⇒ nil ; subrオブジェクトではない。
(subrp (symbol-function 'message)) ⇒ t
この関数は、objectがバイトコード関数の場合は、t
をreturnします。たとえば:
(byte-code-function-p (symbol-function 'next-line)) ⇒ t
この関数はプリミティブsubrの引数リストについての情報を提供します。retrun値は、(min
.
max)
というペアーです。minは引数の最小数です。maxは最大数、または引数&rest
を伴う関数にたいしてはシンボルmany
、subrがスペシャルフォームの場合はシンボルunevalled
です。