; my mailbag

(define (mult left right)
  (let loop ((left left) (right right) (prod 0))
    (cond ((= left 1) (+ prod right))
          ((odd? left)
            (loop (quotient left 2) (* right 2) (+ prod right)))
          (else (loop (quotient left 2) (* right 2) prod)))))

(display (mult 7 13)) (newline)
(display (mult 13 7)) (newline)

(define (compose . fns)
  (let comp ((fns fns))
    (cond ((null? fns) (lambda (x) x)) ; identity function
          ((null? (cdr fns)) (car fns))
          (else (lambda args
                  (call-with-values
                    (lambda () (apply (comp (cdr fns)) args))
                    (car fns)))))))

(define (add1 n) (+ n 1))
(define (double n) (* n 2))
(display ((compose) (+ 1 4))) (newline)
(display ((compose add1) 4)) (newline)
(display ((compose add1 double) 2)) (newline)