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


12.3 Naming a Function

シンボルは関数の名前となることができます。これは、そのシンボルの関数セル(function cell: Symbol Componentsを参照してください)が、関数オブジェクト(たとえばラムダ式)を含むときに起こります。するとそのシンボル自身が呼び出し可能な有効な関数、つまりそのシンボルの関数セルの関数と等価になります。

関数セルの内容は、そのシンボルの関数定義(function definition)と呼ぶこともできます。そのシンボルのかわりに、シンボルの関数定義を使う手続きのことをシンボル関数インダイレクション(symbol function indirection)と呼びます。Function Indirectionを参照してください。与えられたシンボルに関数定義がない場合、シンボルの関数セルはvoidと呼ばれ、それを関数として使用することはできません。

実際のところ、ほとんどすべての関数は名前をもち、その名前により参照されます。ラムダ式を定義することにより名前つきのLisp関数を作成、それを関数セル(Function Cellsを参照してください)に置くことができます。しかし、さらに一般的なのはdefunスペシャルフォーム(次のセクションで説明します)を使う方法です。 Defining Functionsを参照してください。

わたしたちは関数名を与えるのは、Lisp式内で関数を名前で参照するのが便利だからです。また、名前つきの関数は簡単に自分自身を —再帰的(recursive)に参照することができます。さらに、プリミティブはテキスト的な名前だけで参照することができます。なぜならプリミティブ関数は入力構文(read syntax)をもたないオブジェクトだからです(Primitive Function Typeを参照してください)。

関数は一意な名前をもつ必要はありません。与えられた関数オブジェクトは、通常は1つのシンボルの関数セルだけに存在しますが、これは単に慣習的なものです。fsetを使用して、関数を複数のシンボルに格納するのは簡単です。それらのシンボルはそれぞれ、同じ関数にたいする有効な名前となります。

関数として使用されているシンボルを、変数としても利用できることに注意してください。シンボルのこれら2つの利用法は独立しており、競合はしません(これはSchemaのような他のいくつかのLisp方言には当てはまりません)。