在Clojure中定义匿名函数时出错

时间:2014-06-29 16:47:56

标签: clojure

我正在阅读Clojure的欢乐书,并在Ch。中遇到了以下一系列错误。 2:

(def make-list0 #(list))
=> (var cursive-test.core/make-list0)
(make-list0)
IllegalStateException Attempting to call unbound fn: #'cursive-test.core/list  clojure.lang.Var$Unbound.throwArity (Var.java:43)
(def make-list2 #(list %1 %2))
=> (var cursive-test.core/make-list2)
(make-list2 1 2)
IllegalStateException Attempting to call unbound fn: #'cursive-test.core/list  clojure.lang.Var$Unbound.throwArity (Var.java:43)
(def make-list2+ #(list %1 %2 %&))
=> (var cursive-test.core/make-list2+)
(make-list2+ 1 2 3 4 5)
IllegalStateException Attempting to call unbound fn: #'cursive-test.core/list  clojure.lang.Var$Unbound.throwArity (Var.java:43)

我不确定这里发生了什么。我正在使用IntelliJ IDEA和Cursive插件。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

不知何故,你不小心在自己的命名空间中定义了一个名为list的东西,但没有给它一个值。你可能意外地做到这一点的一种方法是在函数内部使用def,但实际上从不调用该函数:

(defn foo [x]
  (def list x))

解决方案是不这样做,恢复正常的最简单方法是重新启动repl并重新加载命名空间,一旦它不再对list进行错误的重新定义。如果找不到您定义它的位置,请注意重新加载命名空间也应该打印一条警告消息,告诉您重新定义list,我认为包含一个行号,但我不记得了。