我正在尝试将一个swank-clojure repl嵌入到我的应用程序中,以便在应用程序运行时将其连接起来。但是,在启动repl后,我无法弄清楚如何访问封闭环境。
嵌入swank-clojure REPL很容易:
(ns mytest
(:use [swank.swank :exclude [-main]])
(:gen-class))
(defn -main [& args]
(let [x 123]
(swank.swank/start-repl)))
运行程序..然后在emacs中执行:
M-x slime-connect
工作正常,我已经联系了。现在,我希望的原因是:这会起作用:
(println x)
;; 123 (what I was hoping for)
;; Unable to resolve symbol: x in this context (cruel reality)
因此,这不是将当前环境传递给嵌入式REPL的方法。
嵌入式REPL有没有办法与我正在运行的程序进行交互?
如果没有,嵌入REPL的原因是什么?
如果它有任何区别,我试图将其作为JAR运行。
这个帖子似乎很相关,但我无法从中获取任何内容:
答案 0 :(得分:5)
let
- 绑定的本地人是词汇范围的,因此swank.swank/start-repl
不会受到围绕调用的let
表单的影响。但是,正在运行的REPL将能够require
/ use
应用程序类路径上的任何Clojure名称空间(或使用in-ns
将REPL的名称空间切换为其中之一)和{{1类路径上的任何Java类,允许您执行许多非常有用的操作,例如重新定义函数,检查和更改任何Refs / Atoms / Vars中保存的其他感兴趣的内容,调用函数/ Java方法等内容
请注意,您import
表单中可能不应该(:use swank.swank)
;而是ns
。不同之处在于,前者将所有(:require swank.swank)
的公共Vars拉入您的命名空间,而后者则不会(swank.swank
,请参阅use = require + refer
等等。您似乎使用名称空间限定符号来访问Swank的Vars,因此您甚至可能不必更改代码的其余部分,(doc use)
可以避免混乱您的命名空间。或者,require
;这只会引入(:use [swank.swank :only [start-repl]])
Var,你可以直接使用它,而不需要start-repl
位。