0

我已经开始在 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)成功使用。

4

2 回答 2

0

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

如果您不能将函数移到第一次使用的上方,您可以(declare to-string)在顶部执行 a 并稍后定义它。

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

于 2011-04-20T13:31:04.590 回答
0

如果没有看到您对该功能的使用很难说to-string,但您可以查看有关如何、、和工作的说明requirenshttp use: //blog.8thlight.com/articles/2010/12/6/clojure-libs-and-命名空间-需要-使用-导入-和-ns。它捕捉了我个人发现的关于库和命名空间的困惑。

于 2011-04-20T13:42:57.400 回答