4

我正在尝试将 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 运行。

该线程似乎相关,但我无法从中获得任何信息:

在java程序中嵌入swank-clojure

4

1 回答 1

5

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's public Vars 拉入您的命名空间,而后者不会(有关详细信息use = require + refer,请参阅(doc use)等)。您似乎使用命名空间限定符号来访问 Swank 的变量,因此您甚至可能不必更改其余代码,并require避免弄乱您的命名空间。或者,(:use [swank.swank :only [start-repl]]); 这只会start-repl引入 Var,然后您可以直接使用它,而无需任何swank.swank/位。

于 2010-06-27T12:56:45.017 回答