как скомпилировать (например, сбой) файл clojure - PullRequest
1 голос
/ 06 августа 2020

Я новичок в clojure. Я определил функцию в test.clj

(defn foldl [f val coll]
  (if (empty? coll) val
    (foldl f (f val (first coll)) (rest coll))))

Я попытался загрузить этот файл

user=> load-file "test.clj"
#object[clojure.lang.RT$3 0x16bb1d20 "clojure.lang.RT$3@16bb1d20"]
"test.clj"

Он не жалуется, но когда я пытаюсь его использовать

foldl + 0 (1 2 3)

Я получаю

Syntax error compiling at (REPL:0:0).
Unable to resolve symbol: foldl in this context

#object[clojure.core$_PLUS_ 0x3df3a187 "clojure.core$_PLUS_@3df3a187"]
0
Execution error (ClassCastException) at user/eval2008 (REPL:1).
java.lang.Long cannot be cast to clojure.lang.IFn

Как мне заставить его скомпилировать и сообщить мне, что не так с функцией, когда я загружаю ее, а не когда выполняю? И что означает ошибка?

1 Ответ

1 голос
/ 06 августа 2020

Вам необходимо использовать круглые скобки при вызове таких функций, как load-file, т.е.

(load-file "test.clj")

без скобок, это просто вычисляет символ load-file, который преобразуется в функцию и строку «test.clj». Оба они отображаются в REPL.

Аналогично при вызове foldl:

(foldl + 0 '(1 2 3))

, в отличие от

foldl + 0 (1 2 3)

- это список из 4 форм - символы foldl и +, длинный 0 и список (1 2 3). Поскольку вам не удалось загрузить файл на предыдущем шаге, foldl не может быть найден, следовательно, возникает ошибка. + преобразуется в функцию clojure.core/+, которая отображается в REPL. 0 вычисляется самому себе и отображается в REPL, в то время как список (1 2 3) оценивается путем попытки вызвать 1 как функцию с аргументами 2 и 3. Поскольку 1 не реализует IFn, вы получаете сообщение об ошибке «java .lang.Long не может быть преобразован в clojure.lang.IFn».

...