This is my Clojure solution to Chapter 1, Exercise 20:
(ns sicp.ch1.ex20)
(defn gcd-pseudo-normal
[a b]
(if-not (and (ifn? a) (ifn? b))
(gcd-pseudo-normal #(identity a) #(identity b))
(if (zero? (b))
(a)
(gcd-pseudo-normal b #(do
(println "Computing remainder")
(rem (a) (b)))))))
(defn gcd
[a b]
(if (zero? b)
a
(gcd b (do
(println "Computing remainder")
(rem a b)))))
(gcd-pseudo-normal (constantly 206)
(constantly 40)) ; => 18 remainder computations
(gcd 206 40) ; => 4 remainder computations
(ns sicp.ch1.ex20)
(defn gcd-pseudo-normal
[a b]
(if-not (and (ifn? a) (ifn? b))
(gcd-pseudo-normal #(identity a) #(identity b))
(if (zero? (b))
(a)
(gcd-pseudo-normal b #(do
(println "Computing remainder")
(rem (a) (b)))))))
(defn gcd
[a b]
(if (zero? b)
a
(gcd b (do
(println "Computing remainder")
(rem a b)))))
(gcd-pseudo-normal (constantly 206)
(constantly 40)) ; => 18 remainder computations
(gcd 206 40) ; => 4 remainder computations