> (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) 3025sumは手続きを引数とする手続きでしたが, 任意の関数を引数にとって,その積分を求めるといった 汎用の手続きを作ることでさらに抽象化が可能です.
> (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-16integralは,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