関数の定義と呼び出し
Lispにおける関数の定義と呼び出しについて.
Lispではdefunを使用することで関数を定義することができる.
(defun 関数名 パラメータリスト 本体)例えば二つのパラメータの和を求める関数sumは以下のように定義できる.
> (defun sum (x y) (+ x y)) SUM > (sum 1 2) 3
(function 関数名)functionは特殊オペレータであり,関数名であらわされる関数そのもの(オブジェクトとしての関数)を返す.
> (function +) #<SYSTEM-FUNCTION +> > (defun sum (x y) (+ x y)) SUM > (function sum) #<CLOSURE SUM (X Y) (DECLARE (SYSTEM::IN-DEFUN SUM)) (BLOCK SUM (+ X Y))>出力はたぶんシステム依存である.関数とfunctionの関係は,変数とquoteの関係と似ている.quoteの省略形として引用符'があるように,functionの省略形として#'がある.
> (function +)は
> #'+と書ける.
関数はリストの最初に関数名を記述してそのリストを評価させることで呼び出せた.
> (defun sum (x y) (+ x y)) SUM > (sum 1 2) 3Lispではこの他にも強力な関数呼び出しの方法がある.関数applyは第一引数の関数に第二引数のリストを引数として渡して,その結果を返す.
> (defun sum (x y) (+ x y)) SUM >(apply #'sum '(1 2)) 3第二引数のリストと同様,関数も#'をつけていることに注意.次にfuncallという関数もある.これはapplyと異なり,第二引数以降がリストでなくてもよい.
> (defun sum (x y) (+ x y)) SUM > (funcall #'sum 1 2) 3
defunを使用して関数名と関数オブジェクトを結びつけることができた.Lispでは,関数名を使用せずに直接関数を表現することができる.
> (lambda (x y) (+ x y)) #<CLOSURE :LAMBDA (X Y) (+ X Y)> > ((lambda (x y) (+ x y)) 1 2) 3 > (funcall #'(lambda (x y) (+ x y)) 1 2) 3