【问题标题】:namespace in clojure not evaluating. Error: Unable to resolve symbol: deftest in this context, compiling:(NO_SOURCE_PATH:1:1)clojure 中的命名空间未评估。错误:无法解析符号:此上下文中的 deftest,正在编译:(NO_SOURCE_PATH:1:1)
【发布时间】:2013-07-21 11:44:08
【问题描述】:

这里是愚蠢的新手问题。我创建了一个全新的 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 评估缓冲区,但它似乎没有读取命名空间规范。

【问题讨论】:

    标签: emacs clojure


    【解决方案1】:

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

    C-x C-e 仅在评估单个表达式的值时真正有用。这样做的好处是这些表达式不需要存在于顶层。 (例如,您可以在文件中放置一个带有一些有用测试表达式的 (comment ...) 部分,然后使用 C-x C-e 在给定 JVM 的当前状态的情况下检查它们的值。)

    【讨论】:

    • C-c C-k 不加载文件中的命名空间。我仍然必须手动将命名空间放入 repl 中。我不知道为什么它会加载测试,而不是命名空间
    • 只是为了确保我们在同一页面上:C-c C-k 应该会导致命名空间被加载(就像 require :reload 一样),但它不应该导致 REPL 切换到它.如果加载没有发生,您应该尝试重新启动 JVM 进程。如果你想切换 REPL 命名空间,你可以在使用 C-c C-krequire 加载命名空间后说 (in-ns 'foo.core),或者你可以使用 nrepl.el 提供的 C-c M-n 绑定(将 REPL 命名空间设置为当前缓冲区)。可能有一个绑定可以两者兼得,不确定......我几乎从不离开 user 命名空间。
    【解决方案2】:

    我不确定你是否解决了这个问题,但我最近在升级一个依赖 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]))
      

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      相关资源
      最近更新 更多