Я изучаю Clojure, решая проблемы, перечисленные в 4clojure . Одно из упражнений - создать свою собственную функцию max
с переменными аргументами.
Я пытаюсь решить эту простую проблему с помощью REPL, и я пришел к следующему решению:
(defn my-max
[first & more] (calc-max first more))
(defn calc-max
[m x]
(cond (empty? x) m
(> (first x) m) (calc-max (first x) (rest x))
:else calc-max m (rest x)))
Что работает нормально, но упражнение не позволяет использовать def
, и поэтому я должен схватить обе функции в одну. Когда я заменяю ссылку calc-max
на его код, результат будет:
(defn my-max
[first & more]
((fn calc-max
[m x]
(cond (empty? x) m
(> (first x) m) (calc-max (first x) (rest x))
:else calc-max m (rest x)))
first more))
Но этот код не работает и возвращает следующую ошибку:
user=> (my-max 12 3 4 5 612 3)
java.lang.ClassCastException: java.lang.Integer cannot be cast to clojure.lang.IFn (NO_SOURCE_FILE:0)
Я предполагаю, что эта ошибка возникает из-за попытки оценить результат функции calc-max
, и я предполагаю, что это синтаксическая ошибка с моей стороны, но я не могу понять, как ее исправить.