Next: , Up: Functions   [Contents][Index]


12.1 What Is a Function?

一般的な意味では、関数とは引数(arguments)と呼ばれる与えられた入力値の計算を担うルールです。計算の結果は、その関数の値(value)、またはreturn値(return value)と呼ばれます。計算は、変数の値やデータ構造の内容を変更する等の副作用をもつこともできます。

ほとんどのコンピューター言語では、関数はそれぞれ名前をもちます。しかしLispでは、厳密な意味において、関数は名前をもちません。関数はオブジェクトであり、関数の名前の役割を果たすシンボルに関連づけることができますが(たとえばcar)、それはオプションです。Function Namesを参照してください。関数が名前を与えられたとき、通常はそのシンボルを“関数”として参照します(たとえば、関数carのように参照します)。このマニュアルでは、関数名と関数オブジェクト自身との間の区別は、通常は重要ではありませんが、それが意味をもつような場合は注記します。

スペシャルフォーム(special form)マクロ(macro)と呼ばれる、関数likeなオブジェクトがいくつかあり、それらも引数を受け受け、計算を担います。しかし以下で説明するように、Emacs Lispではこれらは関数とは考えられません。

以下は関数および関数likeなオブジェクトにたいする、重要な条件です:

lambda expression

Lispで記述された関数(厳密には関数オブジェクト)です。これらについては、以降のセクションで説明します。 Lambda Expressionsを参照してください。

primitive

Lispから呼び出すことができますが、実際にはCで記述されています。プリミティブは、ビルトイン関数(built-in functions)や、サブルーチン(subr)といった呼ばれかたもします。それらの例には関数likeなcarappendが含まれます。加えて、すべてのスペシャルフォーム(以下参照)もプリミティブと考えられます。

関数はLispの基礎となる部分(たとえばcar)であり、オペレーティングシステムのサービスにたいして値レベルのインターフェースを与え、高速に実行される必要があるため、通常はプリミティブとして実装されています。Lispで定義された関数とは異なり、プリミティブの修正や追加には、Cソースの変更とEmacsのリコンパイルが必要です。Writing Emacs Primitivesを参照してください。

special form

プリミティブは関数と似ていますが、すべての引数が通常の方法で評価はされません。いくつかの引数だけが評価されるかもしれず、通常ではない順序で、複数回評価されるかもしれません。プリミティブの例には、ifandwhileが含まれます。Special Formsを参照してください。

macro

あるLisp式を、オリジナルの式のかわりに評価される別の式に変換する、関数とは別のLispで定義された構造です。マクロは、スペシャルフォームが行う一連のことを、Lispプログラマーが行うのを可能にします。Macrosを参照してください。

command

command-executeプリミティブを通じて呼び出すことができるオブジェクトで、通常はそのコマンドにバインドされたキーシーケンスを、ユーザーがタイプすることにより呼び出されます。Interactive Callを参照してください。コマンドは通常、関数です。その関数がLispで記述されている場合は、関数の定義内のinteractiveフォームによりコマンドとなります(Defining Commandsを参照してください)。関数であるコマンドは、他の関数と同様、Lisp式から呼び出すこともできます。

キーボードマクロ(文字列およびベクター)は関数ではありませんが、これらもコマンドです。Keyboard Macrosを参照してください。シンボルの関数セルにコマンドが含まれている場合、わたしたちはそのシンボルをコマンドと言います(Symbol Componentsを参照してください)。そのような名前つきコマンド(named command)は、M-xで呼び出すことができます。

closure

ラムダ式とよく似た関数オブジェクトですが、クロージャーはレキシカル変数バインディングの“環境”にも囲まれています。Closuresを参照してください。

byte-code function

バイトコンパイラーによりコンパイルされた関数です。Byte-Code Typeを参照してください。

autoload object

実際の関数のプレースホルダーです。autoloadオブジェクトが呼び出された場合、Emacsは実際の関数の定義を含むファイルをロードした後、実際の関数を呼び出します。Autoloadを参照してください。

関数functionpを使用して、あるオブジェクトが関数かどうかテストできます:

Function: functionp object

この関数はobjectが任意の種類の関数(たとえばfuncallに渡すことができる)の場合は、tをreturnします。functionpは関数を名づけるシンボルにたいしてはt、スペシャルフォームにたいしてはnilをreturnすることに注意してください。

functionpとは異なり、以下の3つの関数は、シンボルをそれの関数定義としては扱いません

Function: subrp object

この関数は、objectがビルトイン関数(たとえばLispプリミティブ)の場合は、tをreturnします。

(subrp 'message)            ; messageはシンボルであり、
     ⇒ nil                 ;   subrオブジェクトではない。
(subrp (symbol-function 'message))
     ⇒ t
Function: byte-code-function-p object

この関数は、objectがバイトコード関数の場合は、tをreturnします。たとえば:

(byte-code-function-p (symbol-function 'next-line))
     ⇒ t
Function: subr-arity subr

この関数はプリミティブsubrの引数リストについての情報を提供します。retrun値は、(min . max)というペアーです。minは引数の最小数です。maxは最大数、または引数&restを伴う関数にたいしてはシンボルmanysubrがスペシャルフォームの場合はシンボルunevalledです。