; 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)
OyBteSBtYWlsYmFnCgooZGVmaW5lIChtdWx0IGxlZnQgcmlnaHQpCiAgKGxldCBsb29wICgobGVmdCBsZWZ0KSAocmlnaHQgcmlnaHQpIChwcm9kIDApKQogICAgKGNvbmQgKCg9IGxlZnQgMSkgKCsgcHJvZCByaWdodCkpCiAgICAgICAgICAoKG9kZD8gbGVmdCkKICAgICAgICAgICAgKGxvb3AgKHF1b3RpZW50IGxlZnQgMikgKCogcmlnaHQgMikgKCsgcHJvZCByaWdodCkpKQogICAgICAgICAgKGVsc2UgKGxvb3AgKHF1b3RpZW50IGxlZnQgMikgKCogcmlnaHQgMikgcHJvZCkpKSkpCgooZGlzcGxheSAobXVsdCA3IDEzKSkgKG5ld2xpbmUpCihkaXNwbGF5IChtdWx0IDEzIDcpKSAobmV3bGluZSkKCihkZWZpbmUgKGNvbXBvc2UgLiBmbnMpCiAgKGxldCBjb21wICgoZm5zIGZucykpCiAgICAoY29uZCAoKG51bGw/IGZucykgKGxhbWJkYSAoeCkgeCkpIDsgaWRlbnRpdHkgZnVuY3Rpb24KICAgICAgICAgICgobnVsbD8gKGNkciBmbnMpKSAoY2FyIGZucykpCiAgICAgICAgICAoZWxzZSAobGFtYmRhIGFyZ3MKICAgICAgICAgICAgICAgICAgKGNhbGwtd2l0aC12YWx1ZXMKICAgICAgICAgICAgICAgICAgICAobGFtYmRhICgpIChhcHBseSAoY29tcCAoY2RyIGZucykpIGFyZ3MpKQogICAgICAgICAgICAgICAgICAgIChjYXIgZm5zKSkpKSkpKQoKKGRlZmluZSAoYWRkMSBuKSAoKyBuIDEpKQooZGVmaW5lIChkb3VibGUgbikgKCogbiAyKSkKKGRpc3BsYXkgKChjb21wb3NlKSAoKyAxIDQpKSkgKG5ld2xpbmUpCihkaXNwbGF5ICgoY29tcG9zZSBhZGQxKSA0KSkgKG5ld2xpbmUpCihkaXNwbGF5ICgoY29tcG9zZSBhZGQxIGRvdWJsZSkgMikpIChuZXdsaW5lKQ==