次: , 前: Functions, 上: Functions


11.1 関数とはなにか

一般的には、関数とは、引数(arguments)と呼ばれる値を与えられ、 計算を行うための規則です。 この計算結果を関数の値と呼びます。 計算では副作用、つまり、変数の値やデータ構造の内容に継続する変更 を伴うこともできます。

Emacs Lispの関数や関数のようなオブジェクトに関する重要な用語をあげておきます。

関数
Emacs Lispでは、Lispプログラムにおいて引数に適用可能ものは なんであれ関数(function)である。 Lispで書いた関数を意味する場合もある。 スペシャルフォームやマクロは関数ではない。
基本関数
基本関数(primitive)は、carappendなどのCで書いた Lispから呼び出し可能な関数である。 これらの関数は、組み込み関数とかsubrsとも呼ぶ。 (スペシャルフォームは基本関数とも考えられる。)

関数を基本関数として実装する理由は、 それが基本的なものである、 それがオペレーティングシステムの機能に対する 低レベルのインターフェイスを提供する、 あるいは、高速に動作する必要があるからである。 基本関数を変更したり追加する唯一の方法は、 Cソースを変更してエディタを再コンパイルすることである。 see Writing Emacs Primitives

ラムダ式
ラムダ式(lambda expression)は、Lispで書いた関数である。 これらについては以下の節で説明する。
スペシャルフォーム
スペシャルフォーム(special form)は関数に似た基本関数であるが、 その引数すべてを普通のようには評価しない。 引数の一部を評価したり、普通とは異なる順序で評価したり、 複数回評価したりする。 多くのスペシャルフォームについては、 Control Structuresで説明してある。
マクロ
マクロ(macro)は、プログラマがLispで定義した構文である。 マクロと関数との違いは、マクロは、 読者が書いたLisp式をもとの式のかわりに評価される等価な式に変換する。 マクロは、スペシャルフォームでできる種類のことを Lispプログラマに提供する。 マクロの定義方法と使い方については、see Macros
コマンド
コマンド(command)とは、 command-executeが起動できるオブジェクトであり、 キー列に対して定義できる。 いくつかの関数はコマンドである。 Lispで書いた関数に対話宣言(see Defining Commands)が含まれているとき、 その関数はコマンドである。 そのような関数は、他の関数と同様にLisp式から呼び出すことができる。 その場合、関数がコマンドであるという事実は関係ない。

キーボードマクロ(文字列かベクトル)もコマンドであるが、 それらは関数ではない。 シンボルの関数定義がコマンドであれば、シンボルはコマンドである。 そのようなシンボルは、M-xで起動できる。 シンボルの定義が関数であれば、シンボルは関数でもある。

打鍵コマンド
打鍵コマンド(keystroke command)とは、 キー列(典型的には1から3打鍵)にバインドされたコマンドである。 ここでの区別は、Emacs以外のエディタの『コマンド』の意味との 混乱を防ぐためであるが、 Lispプログラムにとっては、この区別は普通は重要ではない。
バイトコード関数
バイトコード関数(byte-code function)とは、 バイトコンパイラでコンパイルした関数である。 see Byte-Code Type
— 機能: functionp object

この関数は、objectが、なんらかの関数、スペシャルフォーム、 マクロであれば、tを返す。

— 機能: subrp object

この関数は、objectが組み込み関数(つまり、Lisp基本関数)であれば tを返す。

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

この関数は、objectがバイトコード関数であればtを返す。 たとえば、つぎのとおり。

          (byte-code-function-p (symbol-function 'next-line))
               => t