Next: 1.2 関数の戻り値として返す手続き
Up: 1 プログラムをデータとして扱う
Previous: 1 プログラムをデータとして扱う
関数をデータとして扱う場合の例として引数として扱う場合として,
下のように:testなどのキーワード引数に
関数を与える例はすでに出てきた.
> (member '(a) '((c) (b) (a)))
NIL
> (member '(a) '((c) (b) (a)) :test #'equal)
((A))
このように引数をとる手続きを
自分で手続きを引数にとる手続きとして
関数列の総和を求めたり,積分や微分を
行う手続きをいかに見てゆくことにします.
> (defun sum (term a next b)
(if (> a b) 0
(+ (funcall term a)
(sum term (funcall next a) next b))))
SUM
> (defun cube (x) (* x x x))
CUBE
> (defun square (x) (* x x))
SQUARE
> (cube 3)
27
> (square 2)
4
> (sum 'cube 1 '1+ 10)
3025
> (sum 'square 1 '1+ 10)
385
> (sum 'cube 1 '(lambda (x) (+ x 1)) 10)
3025
sumは手続きを引数とする手続きでしたが,
任意の関数を引数にとって,その積分を求めるといった
汎用の手続きを作ることでさらに抽象化が可能です.
> (defun integral (f a b dx)
(* (sum f (+ a (/ dx 2.0))
#'(lambda (x) (+ x dx)) b)
dx))
INTEGRAL
> (integral 'cube 0 1 0.1)
0.24875008
> (integral 'cube 0 1 0.01)
0.24998708
> pi
3.141592653589793d0
> (sin pi)
1.2246063538223773d-16
integralは,cubeやsquareという名前を付けない一般的な関数も使えるため非
常に汎用性の高いものとなります.
> (integral #'(lambda (x) x) 0 10 1)
50.0
> (integral #'(lambda (x) x) 0 10 0.1)
49.99998
> (integral #'(lambda (x) (* 2 x)) 0 10 1)
100.0
generated through LaTeX2HTML. M.Inaba 平成18年5月7日