如何编译(例如失败)clojure 文件

how to compile (e.g. fail) a clojure file

我是 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 0x16bb1d20 "clojure.lang.RT@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

我如何强制它编译并在我加载它而不是在执行它时告诉我该函数有什么问题?还有这个错误是什么意思?

你需要在调用像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 因此出现错误。 + 解析为 REPL 中显示的 clojure.core/+ 函数。 0 对其自身求值并显示在 REPL 中,而列表 (1 2 3) 是通过尝试调用 1 作为带有参数 23 的函数来求值的.由于 1 没有实现 IFn,您会收到错误消息“java.lang.Long 无法转换为 clojure.lang.IFn”。