Next: Calling Functions, Previous: Function Names, Up: Functions [Contents][Index]
わたしたちは通常、関数を最初に作成したときに名前を与えます。これは関数の定義(defining a
function)と呼ばれ、defun
マクロにより行われます。
defun
は新たなLisp関数を定義する通常の方法です。これは、引数リストargs、およびbodyにより与えられるbodyフォームとともに、シンボルnameを関数として定義します。nameとargsを、クォートする必要はありません。
docが与えられた場合、それはその関数のドキュメント文字列を指定する文字列であるべきです(Function Documentationを参照してください)。declareが与えられた場合、それは関数のメタデータを指定する、declare
フォームであるべきです(Declare Formを参照してください)。interactiveが与えられた場合、それは関数が対話的に呼び出される方法を指定するinteractive
フォームであるべきです(Interactive Callを参照してください)。
defun
のreturn値は定義されていません。
以下にいくつか例を示します:
(defun foo () 5) (foo) ⇒ 5
(defun bar (a &optional b &rest c) (list a b c)) (bar 1 2 3 4 5) ⇒ (1 2 (3 4 5))
(bar 1) ⇒ (1 nil nil)
(bar) error→ Wrong number of arguments.
(defun capitalize-backwards () "Upcase the last letter of the word at point." (interactive) (backward-word 1) (forward-word 1) (backward-char 1) (capitalize-word 1))
意図せず既存の関数を再定義しないように、注意してください。defun
はcar
のようなプリミティブ関数でさえ、躊躇なく問い合わせもなしに再定義します。Emacsががががこれを妨げることはありません。なぜなら関数の再定義は故意に行われることがあり、そのような意図した再定義を、意図しない再定義と見分ける方法はないからです。
この関数は、定義definition(任意の有効なLisp関数)とともに、シンボルnameを関数として定義します。この関数のreturn値は未定義です。
docが非nil
の場合、それは関数nameのドキュメントになります。それ以外は、definitionにより提供されるドキュメントが使用されます。
内部的には、defalias
は通常、定義のセットにfset
を使用します。しかしnameがdefalias-fset-function
プロパティーをもつ場合、fset
を呼び出すかわりに、それに割り当てられた値が使用されます。
defalias
を使う正しい場所は、特定の関数名がまさに定義される場所 —
特にソースファイルがロードされるとき明示的にその名前が出現する場所です。これはdefalias
が、defun
と同じように、どれが関数を定義するファイルなのか記録するからです(Unloadingを参照してください)。
それとは対象的に、他の目的のために関数を操作するプログラムでは、そのような記録を保持しないfset
を使用するほうがよいでしょう。Function Cellsを参照してください。
defun
やdefalias
で新たなプリミティブ関数を作成することはできませんが、任意の関数定義を変更するのに使用することができ、通常の定義がプリミティブであるcar
やx-popup-menu
のような関数でさえ変更することができます。しかし、これは危険なことです。たとえば、Lispの完全性を損なうことなく、car
を再定義するのはほとんど不可能だからです。それほど有名ではないx-popup-menu
のような関数の再定義では、危険は減るものの、それでも期待したとおりに機能しないかもしれません。Cコードにこのプリミティブの呼び出しがある場合、それは直接そのプリミティブのC定義を呼び出すので、シンボル定義を変更しても、それらに影響はありません。
defsubst
も参照してください。これはdefun
のように関数を定義して、それのインライン展開を処理するようLispコンパイラーに指示します。Inline Functionsを参照してください。