Clojure 如何使用emacs slime/concure添加类路径?

Clojure 如何使用emacs slime/concure添加类路径?,clojure,Clojure,我按照书面说明设置了emacs slime/clojure 当我运行(doseq[p(.getURLs(java.lang.ClassLoader/getSystemClassLoader))](println(.getPath p)))来获取类路径时,我得到以下结果 /Users/smcho/.swank-clojure/clojure-1.1.0-master-20091202.150145-1.jar /Users/smcho/.swank-clojure/clojure-contrib-

我按照书面说明设置了emacs slime/clojure

当我运行(doseq[p(.getURLs(java.lang.ClassLoader/getSystemClassLoader))](println(.getPath p)))来获取类路径时,我得到以下结果

/Users/smcho/.swank-clojure/clojure-1.1.0-master-20091202.150145-1.jar /Users/smcho/.swank-clojure/clojure-contrib-1.1.0-master-20091212.205045-1.jar /Users/smcho/.swank-clojure/swank-clojure-1.1.0.jar /Users/smcho/.swank-clojure/clojure-1.1.0-master-20091202.150145-1.jar /Users/smcho/.swank-clojure/clojure-contrib-1.1.0-master-20091212.205045-1.jar /Users/smcho/.swank-clojure/swank-clojure-1.1.0.jar
如何为emacs/slime为clojure添加类路径?

如果您愿意硬编码Jar文件列表,此emacs Lisp表单应该足够:

(let ((base-path "/Users/smcho/.swank-clojure"))
  (setq swank-clojure-classpath
        (append
         swank-clojure-classpath
         (mapcar (lambda (d)
                   (expand-file-name d base-path))
                 '("clojure-1.1.0-master-20091202.150145-1.jar"
                   "clojure-contrib-1.1.0-master-20091212.205045-1.jar"
                   "swank-clojure/swank-clojure-1.1.0.jar")))))
这将获取Jar文件列表并将它们添加到变量
swank clojure classpath
。请注意,此表单必须由Emacs评估,而不是SLIME的Swank。Emacs使用它来启动Java进程,该进程将在其中运行Clojure和Swank


为项目设置类路径有更详细的方法,例如在指定的项目根目录下包含Maven样式的路径。

我认为现在启动clojure reple的建议方法是使用
lein swank
,并使用
\M-x slime connect
。有关此工具的详细说明,请参阅

使用leiningen,您可以使用配置文件project.clj配置项目。在这个文件中,您可能需要远程(maven-)发布的jar,通过运行
lein deps
您将获得一个包含所有jar的“lib”目录。由于
lein-swank
命令将该目录用作类路径,因此您只需将JAR添加到该目录中即可

也就是说,如果您仍在使用
\M-x swank clojure项目
,它还将检测该目录下的JAR


但是,如果您只是使用普通的
\M-x slime
来启动clojure repl,那么我认为没有“干净”的解决方案(除了向全局环境的$CLASSPATH添加路径或使用一些elisp voodoo(如seh的答案中的一个)来更改java vm命令参数之外。但我相信这只是为了做一些非常基本的实验,不应该用于任何基于项目的工作(正是出于这个原因!)

根据您是使用
slime connect
启动slime(例如,通过连接到使用
lein swank
创建的远程swank服务器)还是使用
M-X slime
启动slime,程序会有所不同

如果您使用的是
slime connect
,则需要修改运行swank服务器的java进程的类路径。如果您使用
lein swank
启动swank服务器,只需将希望成为类路径一部分的JAR添加到项目的
lib
目录中即可

另一方面,如果您正在使用
M-X slime
启动slime,下面的elisp代码将为您带来神奇的效果(只需将其放在~/.emacs文件中即可)


这将向类路径添加
/Users/smcho/.clojure/
/Users/smcho/.clojure/blah.jar
(请注意,您需要重新启动emacs或重新加载.emacs文件:键入
M-X加载库
,然后在下一个提示中键入
.emacs
)在使用.<代码>添加到列表< /代码>时,考虑使用第三个附加参数将这些条目添加到类路径的末尾。最后,如果.Emacs文件不在<代码>加载路径,通常情况下,<代码>加载库< /代码>找不到。您需要use
加载文件
(eval-after-load "swank-clojure"
  '(progn
     (add-to-list 'swank-clojure-classpath
          "/Users/smcho/.clojure/")
     (add-to-list 'swank-clojure-classpath
          "/Users/smcho/.clojure/blah.jar")))