2013-03-19 41 views
2

我是clojure的初学者& emacs。 我正在使用clojure & emacs在clojure-doc.org上的教程。 当我用lein创建了我的测试项目之后,在emacs中启动了nrepl,并且编辑了core_test.clj,我尝试编译了 。emacs&clojure编译错误

然后我得到这个:

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) 

我的项目是用leiningen 2中创建,通过lein new test1。 我正在使用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] 
    {}) 
+0

您是否更改了leiningen放在那里的文件顶部的命名空间行? – 2013-03-19 23:13:19

+0

不,我通过创建不同的项目多次尝试过。 我遵循clojure-doc.org上的步骤 http://clojure-doc.org/articles/tutorials/emacs.html – 2013-03-19 23:16:10

+0

我编辑了我的问题。 – 2013-03-19 23:24:39

回答

1

让我给你,以供参考,是什么工作对我来说:

$ 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 

你执行完全相同的步骤,并得到不良的结果?

+0

你的脚步给了我这个: '加载/home/jakov/dev/PROJECTS/clojure/test1/test/test1/core_test.clj ... #'test1.core测试/ A-test' 然而,我必须按照您的示例将emacs nrepl连接到在终端中运行的repl的确切端口。 这是否意味着需要单独的终端repl运行? 在给定页面的教程使用nrepl插孔没有外部进程..我想得到那个工作。 – 2013-03-20 11:00:27

+0

这是否与我启动emacs,然后是'M-x nrepl-jack-in'这个事实有关,我并没有告诉emacs我的项目路径(我之后只打开了项目文件)? – 2013-03-20 11:09:21

+0

是的,这似乎是问题。我需要首先打开一个项目文件,所以nrepl知道路径和环境。 – 2013-03-20 11:13:18

2

这就是问题所在:

Emacs是需要事先与nrepl-jack-in开始nrepl知道项目的路径。 但是,如果你只用nrepl启动nrepl并将其连接到在单独的终端窗口中启动的repl进程的端口,那么emacs将从它连接的repl进程中知道ab out路径等。

所以,为了事情与nrepl-jack-in工作,你需要的是先打开一个项目文件,像core.cljcore_test.clj,然后开始nrepl-jack-in。在github上

Nrepl页面添加此: 替代你可以使用C-u M-x nrepl-jack-in指定雷音项目的名称,而不必访问任何文件在里面。

+1

nrepl-jack-in对我来说不是很有吸引力,我更喜欢提前启动repl。顺便说一句,你不需要每次都进入端口,你可以在〜/ .lein/profiles.clj中配置一个默认端口:'{:user {:repl-options {:port 4001} ...}}' – 2013-03-20 11:57:05

+0

如果可能的话,我总喜欢把它全部放在一个窗口中。 – 2013-03-20 12:14:22

+0

输出也存在问题。如果你没有在普通的终端窗口中启动repl,那么你将无法监视输出到'System.out/err'的输出,例如控制台日志记录,'e.printStackTrace()'等。从长远来看,您终于可以进入终端窗口。 – 2013-03-20 12:17:49