我已经开始在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)
。
答案 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
函数,但是您可以查看require
,ns
和use
工作原理的解释:{ {3}}。它捕获了我个人发现的关于libs和命名空间的混淆。