【问题标题】:emacs & clojure compiling erroremacs & clojure 编译错误
【发布时间】:2013-03-19 22:36:12
【问题描述】:

我是 clojure 和 emacs 的初学者。 我正在关注 clojure-doc.org 上的 clojure 和 emacs 教程。 在我用 lein 创建了我的测试项目后,在 emacs 中启动了 nrepl 并 编辑了core_test.clj 我试着编译了。

然后我得到了这个:

Loading /home/jakov/dev/PROJECTS/clojure/test1/test/test1/core_test.clj...
FileNotFoundException Could not locate test1/core__init.class or test1/core.clj on       
classpath:   clojure.lang.RT.load (RT.java:432)

我的项目是由lein new test1 使用 leiningen 2 创建的。 我正在使用 emacs24

这可能是什么问题?

编辑: 这是我项目的文件结构:

.
./doc
./doc/intro.md
./.gitignore
./README.md
./project.clj
./src
./src/test1
./src/test1/core.clj
./test
./test/test1
./test/test1/core_test.clj

编辑:

这是我的文件:

core_test.clj

(ns test1.core-test
  (:use clojure.test
        test1.core))

(deftest pairs-of-values
   (let [args ["--server" "localhost"
               "--port" "8080"
               "--environment" "production"]]
      (is (= {:server "localhost"
              :port "8080"
              :environment "production"}
             (parse-args args)))))

core.clj

(ns test1.core)

(defn foo
  "I don't do a whole lot."
  [x]
  (println x "Hello, World!"))

据我了解,这应该给我另一个错误, 据我了解,它应该抱怨解析参数。 但是,当我将其添加到 core.clj 时会发生同样的错误:

(defn parse-args [args]
  {})

【问题讨论】:

  • 您是否更改了 leiningen 放在文件顶部的命名空间行?
  • 没有。我通过创建不同的项目多次尝试了这一点。我按照 clojure-doc.org clojure-doc.org/articles/tutorials/emacs.html 上的步骤进行操作
  • 我编辑了我的问题。
  • 仅在命令行中使用 lein 是否有效?如果您执行lein runlein test,它会起作用还是会出现这些错误?需要知道这是 emacs 中的一般问题还是特定于 nrepl。
  • 澄清一下……您使用的是劣质 lisp、swank + slime 还是 nrepl?

标签: java clojure leiningen emacs24


【解决方案1】:

这就是问题所在:

在使用nrepl-jack-in 启动 nrepl 之前,emacs 似乎需要知道项目的路径。 但是,如果您仅使用 nrepl 启动 nrepl 并将其连接到在单独的终端窗口中启动的 repl 进程的端口,那么 emacs 将从它连接到的 repl 进程中知道输出路径等。

因此,为了使用nrepl-jack-in,您需要先打开一个项目文件,例如core.cljcore_test.clj,然后启动nrepl-jack-in

github 上的 Nrepl 页面添加了以下内容: 您也可以使用C-u M-x nrepl-jack-in 指定 lein 项目的名称,而无需访问其中的任何文件。

【讨论】:

  • nrepl-jack-in 对我来说不是很有吸引力,我一直更喜欢提前开始 repl。 BTW你不需要每次都输入端口,你可以在~/.lein/profiles.clj中配置一个默认端口:{:user {:repl-options {:port 4001} ...}}
  • 输出也有问题。如果您没有在常规终端窗口中启动 repl,那么您将无法监控到 System.out/err 的输出,例如控制台日志记录、e.printStackTrace() 等。从长远来看,您会选择终端窗口.
  • 但不是都显示在消息缓冲区中吗?还是在非常 nrepl 缓冲区中?
  • 我没有足够的插件经验,但我不希望它出现在消息中,因为这是原始 Java 输出。 nrepl 缓冲区将显示对*out*(例如(println ...))的写入,这是原始输出之上的一个级别。另一件事是,由于性能问题,您真的不希望 Emacs 缓冲区中的大量日志记录输出。
【解决方案2】:

让我给你一些对我有用的参考:

$ lein new test1
Generating a project called test1 based on the 'default' template.
To see other templates (app, lein plugin, etc), try `lein help new`.
$ cd test1
$ lein repl
nREPL server started on port 4001
REPL-y 0.1.9
Clojure 1.4.0
    Exit: Control+D or (exit) or (quit)
Commands: (user/help)
    Docs: (doc function-name-here)
          (find-doc "part-of-name-here")
  Source: (source function-name-here)
          (user/sourcery function-name-here)
 Javadoc: (javadoc java-object-or-class-here)
Examples from clojuredocs.org: [clojuredocs or cdoc]
          (user/clojuredocs name-here)
          (user/clojuredocs "ns-here" "name-here")
user=> 

在 Emacs 中:

  • M-x nrepl<RET>
  • 打开文件test/test1/core_test.clj
  • C-c C-k

*Messages* 缓冲区说:

Loading /Users/marko/dev/clj/test1/src/test1/core.clj...
#'test1.core/foo

您是否执行完全相同的步骤并得到不希望的结果?

【讨论】:

  • 您的步骤给了我这个:Loading /home/jakov/dev/PROJECTS/clojure/test1/test/test1/core_test.clj... #'test1.core-test/a-test 但是,根据您的示例,我必须将 emacs nrepl 连接到终端中运行的 repl 的确切端口。这是否意味着有必要运行单独的终端 repl?给定页面的教程使用 nrepl-jack-in 没有外部进程。我想让它工作。
  • 这是否与我启动 emacs,然后 M-x nrepl-jack-in,我没有告诉 emacs 任何关于我的项目路径的事实有关(我后来才打开项目文件)?
  • 是的,这似乎是问题所在。我需要先打开一个项目文件,以便 nrepl 知道路径和环境。
猜你喜欢
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 2014-10-30
  • 2022-12-24
  • 1970-01-01
  • 2011-03-08
  • 2013-01-03
相关资源
最近更新 更多