Macro DEFUN
defun function-name lambda-list [[declaration* | documentation]] form*
=> function-name
function-name - 関数名
lambda-list - 通常のラムダリスト
declaration - 宣言式、評価されません
documentation - 文字列、評価されません
form - 暗黙のprogn
block-name - function-nameの、関数のblock名
グローバル環境下でfunction-nameという名前の新しい関数を定義します。 関数のボディ部は、defunに含まれるフォームによって定義されます。 それは関数が呼ばれたときに、暗黙のprognとして実行されます。 defunは、 新しい関数を定義するときに使われたり、 正しくない定義の修正したバージョンを導入したり、 すでに定義されている関数を再定義したり、 関数としてマクロを再定義するときにも使用できます。
defunは、暗黙的に関数定義のボディ部formを、 block-nameという名前のblockで囲みます (しかしlambda-listのフォームは囲みません)。
documentationは、ドキュメント文字を名前に対して functionという種類で設定し、 関数オブジェクトにも設定します。
defunを評価すると、 下記のラムダ式をdefunが実行された レキシカルな環境な環境下で処理し、 その関数をfunction-nameというグローバルな名前に設定します。
(lambda lambda-list
[[declaration* | documentation]]
(block block-name form*))(引数はマクロ展開時に評価されます)
defunは、コンパイル時にはどのような副作用も要求されていません。 特にdefunは、コンパイル時には関数定義を利用可能にしません。 実装者は、コンパイル時のエラーチェック (関数呼び出し時の引数の個数チェックなど)のために 関数についての情報を保存したり、 関数をインライン展開できるようにすることを選択できます。
(defun recur (x)
(when (> x 0)
(recur (1- x)))) => RECUR
(defun ex (a b &optional c (d 66) &rest keys &key test (start 0))
(list a b c d keys test start)) => EX
(ex 1 2) => (1 2 NIL 66 NIL NIL 0)
(ex 1 2 3 4 :test 'equal :start 50)
=> (1 2 3 4 (:TEST EQUAL :START 50) EQUAL 50)
(ex :test 1 :start 2) => (:TEST 1 :START 2 NIL NIL 0)
;; この関数は呼び出し側で引数の型チェックを行うことを想定しており
;; コンパイラーもその仮定を認めています
(defun discriminant (a b c)
(declare (number a b c))
"Compute the discriminant for a quadratic equation."
(- (* b b) (* 4 a c))) => DISCRIMINANT
(discriminant 1 2/3 -2) => 76/9
;; この関数は呼び出し側で引数の型チェックを行わないと仮定しており
;; どんな仮定より先に明に型チェックを実行します
(defun careful-discriminant (a b c)
"Compute the discriminant for a quadratic equation."
(check-type a number)
(check-type b number)
(check-type c number)
(locally (declare (number a b c))
(- (* b b) (* 4 a c)))) => CAREFUL-DISCRIMINANT
(careful-discriminant 1 2/3 -2) => 76/9なし。
なし。
flet, labels, block, return-from, declare, documentation, 3.1. 評価, 3.4.1. 通常のラムダリスト, 3.4.11. ドキュメント文字と宣言の文脈的な作用
return-fromは、defun定義の関数を 普通より早く返却したいときに使用することができます。
関数定義に関する追加情報(通常はデバッグ情報)が記録されると、 さらなる副作用が発生する可能性があります。