Пытаясь выполнить упражнение 1.16 (итеративная версия fast-exp) в разделе «Структура и интерпретация компьютерных программ» с Clojure, я придумал следующее:
(defn fast-it-exp [base exp res]
(cond (= exp 0) res
(odd? exp) fast-it-exp base (- exp 1) (* base res)
:else fast-it-exp base (/ exp 2) (* base base res)))
Испытание:
user=> (fast-it-exp 0 0 10)
10 ;yep
user=> (fast-it-exp 2 2 2)
1 ;no...
user=> (fast-it-exp 1 1 1)
#<user$fast_it_exp__59 user$fast_it_exp__59@138c63> ;huh?!
Кажется, что "нечетная" часть выражения cond возвращает функцию вместо оценки. Зачем?
Я пытался поместить скобки вокруг выражений после предикатов, но это, кажется, неправильный синтаксис, это лучшее, что я смог придумать.
Я использую версию 1146 Clojure.