next up previous
Next: 1.2 関数の戻り値として返す手続き Up: 1 プログラムをデータとして扱う Previous: 1 プログラムをデータとして扱う

1.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月6日