我试图将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)

因此,这不适用于将当前环境传递到嵌入式式宽带的一种方式。

有什么办法让嵌入式的卧台与我的跑步程序进行交互?

如果没有,有什么原因嵌入了卧底?

如果有什么不同,我正在尝试将其作为罐子运行。

这个线程似乎是相关的,但是我无法从中获得任何内容:

嵌入Swank-Clojure在Java计划中

有帮助吗?

解决方案

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/ 少量。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top