next up previous
Next: 11.2 Map関数 Up: 11 関数をデータとして扱う関数の例 Previous: 11 関数をデータとして扱う関数の例

11.1 関数呼び出しのための基本関数: funcall, apply

Lispは関数に対して関数を引数とできる高階関数を簡単に利用できるところにも 特長があります.関数データを示すために function というスペシャルフォー ムがあります.quote(')と同じように簡略記号(#')を用いることが可能です. 関数に実引数を渡してEVALを行なう汎関数として,funcall,applyが用意され ています.
<cl> (defun test (x y) (print (list x y)) (+ x y))
TEST
<cl> (test 1 2)
(1 2)
3
<cl> (function test)
(LAMBDA (X Y) (BLOCK TEST (PRINT (LIST X Y)) (+ X Y)))
<cl> (funcall (function test) 1 2)
(1 2)
3
<cl> #'test
(LAMBDA (X Y) (BLOCK TEST (PRINT (LIST X Y)) (+ X Y)))
<cl> (funcall #'test 2 3)
(2 3)
5
<cl> (apply #'test '(2 3))
(2 3)
5
ラムダ式を直接,funcallやapplyに与えることもできます.
<cl> ((lambda (x) (list x)) 2)
(2) 
<cl> (setq a '(lambda (x) (list x)))
(LAMBDA (X) (LIST X)) 
<cl> (funcall a 2)
(2) 
<cl> (setq a #'(lambda (x) (list x)))
(LAMBDA (X) (LIST X)) 
<cl> (setq b '(lambda (x) (list x)))
(LAMBDA (X) (LIST X)) 
<cl> (equal a b)
T 
<cl> (setq c #'(lambda (y) (list y)))
(LAMBDA (Y) (LIST Y)) 
<cl> (funcall a 1)
(1) 
<cl> (funcall b 1)
(1) 
<cl> (funcall c 1)
(1) 
<cl> (eq a b)
NIL 
<cl> (equal a b)
T 
<cl> (equal a c)
NIL
という具合に,ラムダ式は,リストデータと同じように扱うことができます.

generated through LaTeX2HTML. M.Inaba 平成18年5月7日