(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
