タイトル修正。
lambda
前準備
(define tolerance 0.00001) (define (fixed-point f first-guess) (define (close-enough? v1 v2) (< (abs (- v1 v2)) tolerance)) (define (try guess) (let ((next (f guess))) (if (close-enough? guess next) next (try next)))) (try first-guess)) (define (deriv g) (lambda (x) (/ (- (g (+ x dx)) (g x)) dx))) (define dx 0.00001) (define (newton-transform g) (lambda (x) (- x (/ (g x) ((deriv g) x))))) (define (newtons-method g guess) (fixed-point (newton-transform g) guess)) (define (average-damp f) (lambda (x) (average x (f x)))) (define (average x y) (/ (+ x y) 2))
1.40
(define (cubic a b c) (lambda (x) (+ (* x x x) (* a x x) (* b x) c)))
1.41 (関数を2回適用する関数を返す関数)
(define (double proc) (lambda (arg) (proc (proc arg))))
1.42 (compose)
(define (compose f g) (lambda (x) (f (g x))))
1.43
(define (repeated f n) (if (= n 0) (lambda (x) x) (compose f (repeated f (- n 1)))))
1.44
(define (smooth f) (lambda (x) (/ (+ (f (- x dx)) (f x) (f (+ x dx))) 3))) (define (smoothed f n) ((repeated smooth n) f))
1.45
(define (nth-root x n m) (fixed-point ((repeated average-damp m) (lambda (y) (/ x (expt y (- n 1))))) 1.0))
1.46 (最後の抽象化)
(define (iterative-improve good-enough? improve-guess) (define (guess-until-good-enough guess) (if (good-enough? guess) guess (guess-until-good-enough (improve-guess guess)))) guess-until-good-enough) (define (sqrt x) ((iterative-improve (lambda (guess) (< (abs (- (* guess guess) x)) 0.001)) (lambda (guess) (average guess (/ x guess)))) 1.0)) (define (fixed-point f first-guess) ((iterative-improve (lambda (guess) (< (abs (- guess (f guess))) 0.00001)) f) first-guess))
抽象化完了。