Next: Calling Functions, Previous: Function Names, Up: Functions
関数を作成するときには、普通、関数に名前を与えます。
これを関数を定義すると呼び、
スペシャルフォームdefun
で行います。
defun
は、新たにLisp関数を定義する普通の方法である。 これは、シンボルnameをつぎのような関数として定義する。(lambda argument-list . body-forms)
defun
は、このラムダ式をnameの関数セルに格納する。 値nameを返すが、普通、これは無視する。前述(see Lambda Expressions)のように、 argument-listは引数名のリストであり、 キーワード
&optional
や&rest
が入っていてもよい。 また、body-formsの最初の2つは、説明文字列と対話宣言でもよい。同一のシンボルnameを変数として使っていても衝突はない。 というのは、シンボルの値セルは関数セルとは独立だからである。 see Symbol Components。
例を示そう。
(defun foo () 5) foo (foo) 5 (defun bar (a &optional b &rest c) (list a b c)) bar (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 a word." (interactive) (backward-word 1) (forward-word 1) (backward-char 1) (capitalize-word 1)) capitalize-backwards既存の関数を意図せずに再定義しないように注意すること。
defun
は、たとえcar
などの基本関数であっても、 なんの躊躇も注意もせずに再定義してしまう。 既存関数の再定義は注意深く行うが、 不本意な再定義と熟考した再定義を区別する方法はない。
このスペシャルフォームは、 シンボルnameを定義definition(任意の正しいLisp関数)とする 関数として定義する。
defalias
を使う正しい場所は、 特定の関数名が定義されている場所である。 特に、ロード中のソースファイルで明示的に名前が現れている場所である。 というのは、defalias
は、defun
と同様に、 関数が定義されたファイルを記録するからである(see Unloading)。一方、他の目的で関数定義を操作するプログラムでは、 そのような記録を保持しない
fset
を使うのがよい。
defun
のように関数を定義し、かつ、
Lispコンパイラに関数定義を展開するように指示する
defsubst
も参照してください。
See Inline Functions。