; expt. (lambda (op one inv) (letrec ((b (lambda (a n) (let b ((n n)) (if (< n 4) (if (< n 2) (if (zero? n) one a) (if (= n 2) (op a a) (op (op a a) a))) (let* ((p (b (quotient n 2)))(p2 (op p p))) (if (odd? n) (op a p2) p2))))))) (if inv (lambda (a n) (if (< n 0) (inv (b a (- n))) (b a n))) b))) ; tail recursive alternative: ; This code often does one or two unnecessary multiplications. (lambda (op one inv) (let ((b (lambda (a n) (let E ((a one)(p a)(n n)) (if (= n 0) a (E (if (odd? n) (op a p) a) (op p p) (quotient n 2))))))) (if inv (lambda (a n) (if (< n 0) (inv (b a (- n))) (b a n))) b))) ; tests (let ((pow ((fileVal "expt") * 1 /))) (((fileVal "Do") 'DoL) 12 (lambda (j) (pow 2 (- j 2))))) (let ((pow ((fileVal "expt") * 1 #f))) (((fileVal "Do") 'DoL) 12 (lambda (j) (pow 2 j)))) (define p ((fileVal "expt") * 1 /)) (define (lp n) (if (zero? n) '() (cons (p 2 n) (lp (- n 1))))) (lp 21)