Может ли встроенный реплик swank-clojure получить доступ к программе, в которую он встроен? - PullRequest
4 голосов
/ 27 июня 2010

Я пытаюсь встроить реплик swank-clojure в свое приложение с целью подключения, пока приложение работает, чтобы копаться в вещах. Однако у меня возникают проблемы с выяснением, как получить доступ к окружающей среде после запуска repl.

Внедрение REPL 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)

Так что это не работает как способ передачи текущей среды во встроенный REPL.

Есть ли способ для встроенного REPL взаимодействовать с моей запущенной программой?

Если нет, то для чего нужно встраивать REPL?

Если это что-то меняет, я пытаюсь запустить это как JAR.

Эта тема, кажется, связана, но я не смог получить от нее ничего:

Встраивание swank-clojure в Java-программу

1 Ответ

5 голосов
/ 27 июня 2010

let связанные местные жители имеют лексическую область видимости, поэтому на swank.swank/start-repl не повлияет форма let, обернутая вокруг вызова к ней. Тем не менее, запущенный REPL сможет require / use любых пространств имен Clojure на пути к классам вашего приложения (или использовать in-ns для переключения пространства имен REPL на одно из них) и import любых классов Java на пути к классам , позволяя вам делать ряд очень полезных вещей, таких как переопределение функций, проверка и изменение содержимого любых ссылок / атомов / других интересных вещей, хранящихся в Vars, вызов функций / методов Java и т. д.

Обратите внимание, что вы, вероятно, не должны (:use swank.swank) в форме ns; (:require swank.swank) вместо. Разница в том, что первый тянет все публичные переменные swank.swank в ваше пространство имен, а второй - нет (use = require + refer, подробности см. (doc use) и т. Д.). Похоже, вы используете символы, соответствующие пространству имен, для доступа к переменным Суонка, поэтому вам, возможно, даже не придется менять остальную часть кода, а require позволяет избежать загромождения пространства имен. В качестве альтернативы (:use [swank.swank :only [start-repl]]); это включает только start-repl Var, который вы затем можете использовать напрямую, без бита swank.swank/.

...