(define rootfinder (let ((epsilon 1e-8)) (lambda (p a b) (let ((mid (/ (+ a b) 2.0))) (if (< (- b a) epsilon) mid (let ((s1 (if (> (p a) 0) 'pos 'neg)) (s2 (if (> (p mid) 0) 'pos 'neg))) (if (eq? s1 s2) (rootfinder p mid b) (rootfinder p a mid)))))))) (define sqrteq (lambda (a) (lambda (x) (- (* x x) a)))) (define r5 (rootfinder (sqrteq 5) 0 5)) r5 (* r5 r5) (define cbrteq (lambda (a) (lambda (x) (- (* x x x) a)))) (define cr7 (rootfinder (cbrteq 7) 0 7)) cr7 (* cr7 cr7 cr7) (define pi (rootfinder (lambda (x) (cos (/ x 2))) 3 4)) pi