Может ли встроенный Swank-Clojure rep rect в программе это встроен?

StackOverflow https://stackoverflow.com/questions/3126456

  •  30-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь встроить Swank-Clojure, чтобы заменять в мою приложение с целью подключения, когда приложение бежит, чтобы принудиться с вещами. Однако у меня проблемы с выяснением того, как получить доступ к ограждающей среде после запуска REFL.

Встраивание 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)

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

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

Если нет, какие причины есть встроить REFL?

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

Эта нить кажется связанной, но я не смог добраться от этого:

Встраивание Swank-Clojure в программе Java

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top