我目前正在向 Tomcat 容器中的现有 J2EE webapp 添加功能,并且正在使用 Clojure 编写我的添加。我的设置很简单:我只是添加对 clojure 生成的静态方法的调用,并从 clojure 端编写所有艰苦的工作。构建过程包括编译 clojure 代码 ( lein uberjar
),然后在类路径中使用该 jar 编译 java 代码。
在 webapp init 中,我调用了一个生成的类,该类使用(swank/start-repl)
. 我希望能够将我的 Aquamacs 粘液连接到该服务器,并从那里进行交互工作(到目前为止,我不会尝试任何需要 Java 端重新编译的东西)。但是我有一个我不太了解的情况。如果我执行 a \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)))
假设这是编译并包含在 webapp 加载的 uberjar 中,我可以 eval/inspect my.namespace/*secret*
。但是如果我尝试在代码缓冲区内进行评估,Slime 会认为我在user
命名空间中(这甚至可以说得通!)。但现在我只剩下一个工作选项——我必须评估——文件中的所有表格!\C-c \C-l
(加载源文件)不会做任何事情 - 显然只是返回 nil 并且不输出任何其他内容。编译一切似乎就是这样做的——它会编译,如果找到错误就会显示错误,但不会改变我的命名空间。最奇怪的是\C-~
(同步包和目录),它使用 Common Lisp 完成了我想要的,但在这里它永久冻结了 clojure REPL。
始终可以选择切换到 REPL,键入(in-ns 'my.namespace)
,然后一切正常。但是当 clojure 文件的数量越来越多时,这根本不够实用(因为代码缓冲区的命名空间不会自动更改!)
那么,我的问题是,我是否缺少基本的命令/配置——或者是否有明显的原因导致这种行为发生。