嵌入式swank-clojure repl可以访问它嵌入的程序吗?

all*_*aws 4 clojure swank

我正在尝试将一个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)))
Run Code Online (Sandbox Code Playgroud)

运行程序..然后在emacs中结束:

M-x slime-connect 
Run Code Online (Sandbox Code Playgroud)

这工作正常,我连接.现在,我希望这会起作用:

(println x)
;; 123 (what I was hoping for)
;; Unable to resolve symbol: x in this context (cruel reality)
Run Code Online (Sandbox Code Playgroud)

因此,这不能作为将当前环境传递给嵌入式REPL的方法.

嵌入式REPL有没有办法与我正在运行的程序进行交互?

如果没有,嵌入REPL的原因是什么?

如果它有任何区别,我试图将其作为JAR运行.

这个线程似乎有关系,但我无法从中得到任何结论:

在java程序中嵌入swank-clojure

Mic*_*zyk 5

let-bound locals是词法范围的,因此swank.swank/start-repl不会受到let围绕调用的表单的影响.但是,正在运行的REPL将能够require/ use应用程序类路径上的任何Clojure命名空间(或用于in-ns将REPL的命名空间切换到其中一个)和import类路径上的任何Java类,允许您执行许多非常有用的操作,例如重新定义函数,检查和更改Vars中保存的任何Refs/Atoms /其他感兴趣的内容,调用函数/ Java方法等.

请注意,您可能不应该(:use swank.swank)使用自己的ns形式; (:require swank.swank)代替.不同之处在于,前者将所有swank.swank的公共Vars引入您的命名空间,而后者则没有(use = require + refer详见(doc use)详见).您似乎使用名称空间限定符号来访问Swank的Vars,因此您甚至可能不必更改代码的其余部分,并require避免使命名空间混乱.或者,(:use [swank.swank :only [start-repl]]); 这只是拉入start-replVar,你可以直接使用它,没有swank.swank/位.