Clojure仅在使用命名空间时才会抛出错误

时间:2011-04-20 13:13:41

标签: clojure leiningen clojure-contrib

我已经开始在Clojure中进行国际象棋游戏了,但我的命名空间遇到了问题。在我的文件顶部,我有

(ns chess.core
    (:require clojure.contrib.str-utils2))

并定义了几个函数,包括to-string,它将游戏块的符号转换为字符串。但是,当我编译时:

core.clj:21:8:
  error: java.lang.Exception: Unable to resolve symbol: to-string in this context (core.clj:21)

我做了一些实验,发现第一次调用我自己定义的函数时出现错误。我还发现,如果我注释掉ns来电,我通常就不会出错。有时它可以通过重新启动Swank服务器来修复(有时它不能)。有一段时间我只有(ns chess.core),它犯了同样的错误,所以我评论了它并继续黑客攻击。但现在我需要大写一些东西,所以我需要str-utils。

谈到str-utils,我使用Leiningen,并在project.clj下的:dependencies中有以下内容:

                 [org.clojars.jhowarth/clojure-contrib "1.2.0-RC3"]]
;                [clojure.contrib.str-utils2 "1.2.1"]]

最上面一个起作用,底部起作用。

所以我觉得我对Clojure命名空间和库如何工作一无所知,但同时其他人似乎都成功使用(ns foo.bar)

2 个答案:

答案 0 :(得分:0)

编译时,定义从上到下进行评估。如果您引用文件中稍后定义的函数,则会收到该错误。我想通过删除顶部的ns,你实际上是指另一个命名空间中具有相同名称的函数(可能是默认用户ns)。

如果您无法将该功能移至首次使用之上,您可以在顶部执行(declare to-string)并稍后进行定义。

对于str-utils2包,它应该已经在clojure-contrib 1.2X中。从1.3(未完成)开始,contrib将被拆分。见http://groups.google.com/group/clojure/msg/c5cdfec990efb6f4

答案 1 :(得分:0)

很难说没有看到您使用to-string函数,但是您可以查看requirensuse工作原理的解释:{ {3}}。它捕获了我个人发现的关于libs和命名空间的混淆。