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

时间:2010-06-27 05:18:14

标签: 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)))

运行程序..然后在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运行。

这个帖子似乎很相关,但我无法从中获取任何内容:

Embedding swank-clojure in java program

1 个答案:

答案 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位。