嵌入式的Swank-Clojure可以访问其嵌入的程序吗?
题
我试图将Swank-Clojure替补嵌入到我的应用程序中,以便在应用程序运行以与事物陷入困境时进行连接。但是,我很难弄清楚如何在启动重置后访问封闭环境。
嵌入Swank-Clojure替补非常容易:
(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)
因此,这不适用于将当前环境传递到嵌入式式宽带的一种方式。
有什么办法让嵌入式的卧台与我的跑步程序进行交互?
如果没有,有什么原因嵌入了卧底?
如果有什么不同,我正在尝试将其作为罐子运行。
这个线程似乎是相关的,但是我无法从中获得任何内容:
解决方案
let
- 结合当地人是词汇范围的,因此 swank.swank/start-repl
不会受到 let
围绕着呼叫的表格。但是,运行式替补将能够 require
/ use
应用程序类路径上的任何clojure名称空间(或使用 in-ns
要将depp的名称空间切换到其中之一)和 import
类Path上的任何Java类,允许您执行许多非常有用的事情,例如重新定义功能,检查和更改var中持有的任何参考 /原子 /其他感兴趣的内容,调用函数 / 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/
少量。