如何将clojure源文件连接到Emacs上正在运行的clojure repl?

Edg*_*gar 5 emacs aquamacs clojure slime

我目前正在为Tomcat容器中的现有J2EE webapp添加功能,我正在使用Clojure编写我的添加内容.我的设置很简单:我只是添加对clojure生成的静态方法的调用,并编写来自clojure方面的所有艰苦工作.构建过程包括编译clojure代码(lein uberjar),然后在类路径上使用该jar编译java代码.

在webapp init中,我调用了一个生成的类,该类使用a激活swank服务器(swank/start-repl).我希望能够将我的Aquamacs的粘液连接到该服务器,并从那里以交互方式工作(直到某一点,我不会尝试任何需要java端重新编译的东西).但我有一种我不太明白的情况.如果我这样做\M-x slime-connect,我会得到一个REPL提示符(在收到通知后没有低级的lisp进程,我认为没关系,因为劣质的lisp进程在emacs控制之外运行).我可以完美地评估表格,我甚至可以检查类似的东西my.own.namespace/my-var.但是,如果我访问一个已经编译过的clojure代码的文件,我似乎无法让slime认出它作为它的来源.考虑一个简单的clojure文件:

(ns my.namespace
  (:gen-class
   :name my.namespace
   :methods [#^{:static true} [testFunc [] void]]))

(def *secret* "shhhh")

(defn -testFunc []
  (println (str "our secret is: " secret)))
Run Code Online (Sandbox Code Playgroud)

假设这是编译并包含在webapp加载的uberjar中,我可以进行评估/检查my.namespace/*secret*.但是如果我尝试在代码缓冲区内进行评估,那么Slime认为我在user命名空间中(甚至可以理解!).但现在我只剩下一个工作选项了 - 我必须逐一评估文件中的所有表格!\C-c \C-l(加载源文件)将不会做任何事情 - 显然只返回nil并输出其他内容.编译所有内容似乎就是这样 - 它编译,如果找到它们会显示错误,但不会更改我的命名空间.而最奇怪的是\C-~(同步包和目录),它使用Common Lisp它正是我想要的,但在这里它冻结了clojure REPL.

总是可以选择切换到REPL,打字(in-ns 'my.namespace),然后一切正常.但是当clojure文件数量增加时,这根本不够实用(因为代码缓冲区的命名空间不会自动更改!)

我的问题是,我是否缺乏基本的命令/配置 - 或者是否有明显的原因导致这种行为发生.

Isa*_*aac 5

我可能误解了你的问题,但你不能(在emacs中访问这个假设的缓冲区时),点击C-c C-k编译当前Clojure实例中的缓冲区(Slime连接到什么)?

然后,在Slime缓冲区中,使用a切换到此命名空间(in-ns 'my.namespace).然后,您应该可以访问在该命名空间中编译的内容.


Edg*_*gar 1

我刚刚发现, slime-redirect-inferior-output从 slime-repl.el 中删除了这个问题的罪魁祸首:是从我设置的挂钩中调用的。事实证明,如果没有劣质 lisp 进程(请阅读,从 emacs 内部启动的 swank 服务器),它就无法正常运行。

因此,一个快速的解决方法就是error从该函数中删除表单,如下所示。现在挂钩继续进行,并且名称空间将自动计算。如预期。尽管如此,还是感谢您的建议 - 他们引导我找到了这个解决方案!