В коде есть две отдельные ошибки.
Первая вызывает (first list (sum (rest list)))
, которая вызывает first
с 2 аргументами, когда вы хотели сделать вторую часть вторым аргументом +
.
Еще одно, приводящее к фактическому исключению, - это дополнительные ()
вокруг тела функции. Обратите внимание на ((if ...))
, что означает, что вы пытаетесь вызвать то, что if
возвращает как функцию. В этом случае он возвращает число, что приводит к ошибке class java.lang.Long cannot be cast to class clojure.lang.IFn
.
Исправленная версия будет иметь вид
(defn sum [list]
(if (empty? list)
0
(+ (first list)
(sum (rest list)))))
Перемещение аргументов в +
в отдельные строки облегчает читать в этом случае (ИМХО).