我正试图在我的应用程序中嵌入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)))运行程序..。然后用电子邮件:
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的原因是什么?
如果有什么区别的话,我正试着把它作为一个罐子运行。
这条线似乎是有关联的,但我无法从中得到任何东西:
发布于 2010-06-27 12:56:45
let-bound局部变量是在词汇上限定作用域的,因此swank.swank/start-repl不会受到围绕对它的调用包装的let表单的影响。但是,运行的REPL将能够在应用程序的类路径上require / use任何Clojure名称空间(或使用in-ns将REPL的命名空间切换到其中之一),并能够在类路径上import任何Java类,从而允许您执行许多非常有用的操作,例如重新定义函数、检查和更改任何Refs / Atoms /其他在Vars中具有兴趣的内容、调用函数/ Java方法等。
请注意,您可能不应该在(:use swank.swank)表单中使用ns;而是(:require swank.swank)。不同之处在于,前者将所有swank.swank的公共Var都引入到您的命名空间中,而后者则不会(详细信息请参见use = require + refer,参见(doc use)等)。您似乎使用命名空间限定符号来访问Swank的Var,因此您甚至可能甚至不必更改其余代码,require也可以避免混淆您的命名空间。或者,(:use [swank.swank :only [start-repl]]);这只牵扯到start-repl Var,然后您可以直接使用它,而无需使用swank.swank/比特。
https://stackoverflow.com/questions/3126456
复制相似问题