Emacs clojure中的命名空间未计算。错误:无法在此上下文中解析符号:deftest,正在编译:(无源路径:1:1)

Emacs clojure中的命名空间未计算。错误:无法在此上下文中解析符号:deftest,正在编译:(无源路径:1:1),emacs,clojure,Emacs,Clojure,愚蠢的新手问题。我创建了一个全新的lein项目,并尝试在“core_test.clj”文件中运行示例测试。我正在使用emacs和“nrepl插孔”。但当我从repl运行“(运行所有测试)”时,我得到: 无法在此上下文中解析符号:deftest,正在编译:(无源路径:1:1) 有趣的是,测试是从这两种场景中进行的: 1) 命令行中的“lein测试” -或- 2) 如果我事先在repl中输入以下行: (ns my-prog.core-test (:require[clojure.test:参考:全部

愚蠢的新手问题。我创建了一个全新的lein项目,并尝试在“core_test.clj”文件中运行示例测试。我正在使用emacs和“nrepl插孔”。但当我从repl运行“(运行所有测试)”时,我得到:

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

有趣的是,测试是从这两种场景中进行的:
1) 命令行中的“lein测试”
-或-
2) 如果我事先在repl中输入以下行:

(ns my-prog.core-test (:require[clojure.test:参考:全部] [my-prog.core:参考:全部])

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

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


C-x C-e仅在计算单个表达式的值时才真正有用。它的好处是,这些表达式不需要处于顶层。(例如,您可能会在文件中放置一个带有一些有用测试表达式的
(comment…
)部分,然后使用C-x C-e检查它们的值(给定JVM的当前状态)。

我不确定您是否解决了这个问题,但我最近在升级一个依赖Clojure 1.2的旧库时遇到了这个问题。过了一会儿,我意识到
:refere:all
语法是正确的。这个问题有两种解决方案:

  • 升级到Clojure 1.4+:

    project.clj
    中更新依赖项,例如
    [org.clojure/clojure“1.4.0”]
    切换到clojure 1.4

  • 使用
    改用
    ;在这种情况下,命名空间声明将是:

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

希望有帮助

C-C-k不在文件中加载名称空间。我必须手动将名称空间放在repl中。我不知道为什么它会加载测试,而不是名称空间,只是为了确保我们在同一页上:
C-C-k
应该导致加载名称空间(就像通过
require:reload
),但它不应该导致REPL切换到它。如果加载没有发生,您应该尝试重新启动JVM进程。如果要切换REPL名称空间,可以在加载带有
C-C-k
require
的名称空间后说
(在ns'foo.core中)
,或者可以使用nrepl.el提供的
C-C M-n
绑定(将REPL名称空间设置为当前缓冲区的名称空间)。可能有一个绑定同时执行这两个功能,不确定。。。我几乎从不离开
用户
名称空间。