clojure中的命名空间没有评估。错误:无法在此上下文中解析符号:deftest,编译:(NO_SOURCE_PATH:1:1)

时间:2013-07-21 11:44:09

标签: emacs clojure

这里愚蠢​​的新手问题。我创建了一个全新的lein项目,我正在尝试在“core_test.clj”文件中运行示例测试。我正在使用emacs和“nrepl-jack-in”。但是当我从repl运行“(run-all-tests)”时,我得到:

  

无法在此上下文中解析符号:deftest,编译:(NO_SOURCE_PATH:1:1)

有趣的是,测试是根据以下两种情况进行的: 1)命令行中的“lein test” - 或 -
2)如果我事先将以下行放在repl中:

  

(ns my-prog.core-test     (:require [clojure.test:refer:all]               [my-prog.core:refer:all]))

有趣的是,这一行是在“core_test.clj”文件本身,但我想它不是出于某种原因进行评估。我正在使用emacs中的Ctrl-x Ctrl-e评估缓冲区,但它似乎没有读取命名空间规范。

2 个答案:

答案 0 :(得分:1)

您需要使用 C-c C-k 来评估整个缓冲区。它一次加载文件。或者,您可以在REPL中require所需的命名空间,可能传入:reload:reload-all以使以前加载的命名空间再次加载。 (你也可以require你的命名空间首先给它一个别名 - (require '[foo.core :as foo]) - 然后使用和弦重新加载。)

C-x C-e 仅对评估其值的单个表达式非常有用。关于它的好处是那些表达式不需要生活在顶层。 (例如,您可以在文件中放置一个带有一些有用测试表达式的(comment ...)部分,然后使用 Cx Ce 在给定JVM的当前状态的情况下检查它们的值。)

答案 1 :(得分:1)

我不确定你是否已经解决了这个问题,但最近我在升级一个将Clojure 1.2作为依赖项的旧库时遇到了这个问题。一段时间后,我意识到:refer :all语法是added in Clojure 1.4。这个问题有两种解决方案:

  • 升级到Clojure 1.4+:

      

    project.clj更新依赖关系,例如[org.clojure/clojure "1.4.0"]切换到Clojure 1.4。

  • 请改用use;在这种情况下,名称空间声明将是:

    (ns my-prog.core-test 
      (:use [[clojure.test] 
             [my-prog.core]))
    

希望有所帮助!