我正在尝试将一个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运行.
这个线程似乎有关系,但我无法从中得到任何结论:
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/位.
| 归档时间: |
|
| 查看次数: |
592 次 |
| 最近记录: |