Пытаясь выполнить упражнение 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.
(передfast-it-exp. И не только в последней строке… - person Display Name   schedule 05.03.2015