Eine eingebettete Swank-clojure repl Zugriff auf das Programm es in eingebettet ist?
Frage
Ich versuche einzubetten einem Swank-clojure repl in meine Anwendung zum Zweck der Verbindung, während die App mit den Dingen vertrödeln laufen. Aber ich habe Probleme, herauszufinden, wie die umschließenden Umgebung zugreifen kann, nachdem die repl zu starten.
Die Einbettung der Protz-clojure REPL ist einfach genug:
(ns mytest
(:use [swank.swank :exclude [-main]])
(:gen-class))
(defn -main [& args]
(let [x 123]
(swank.swank/start-repl)))
Starten Sie das Programm .. dann über in Emacs:
M-x slime-connect
Das funktioniert gut und ich verbunden bin. Nun, was ich gehofft war, dass dies funktionieren würde:
(println x)
;; 123 (what I was hoping for)
;; Unable to resolve symbol: x in this context (cruel reality)
So, die nicht Arbeit als Art und Weise tut, um die aktuelle Umgebung auf den eingebetteten REPL zu passieren.
Gibt es eine Möglichkeit für das eingebettete REPL mit meinem laufenden Programm zu interagieren?
Falls nicht, welche Gründe gibt es zu einem REPL einbetten?
Wenn es einen Unterschied macht, ich versuche, dies als JAR ausgeführt werden.
Dieser Thread scheint verwandt, aber ich war nicht in der Lage überall davon zu bekommen:
Lösung
let
gebunden Einheimischen lexikalische, wird somit swank.swank/start-repl
nicht durch eine let
Form um den Anruf, um es gewickelt betroffen sein. Allerdings wird der Lauf REPL die Lage sein, require
/ use
alle Clojure Namespaces auf Ihrer Anwendung Classpath (oder Verwendung in-ns
die REPL Namespace zu einem von denen wechseln) und alle Java-Klassen auf dem Classpath import
, so dass Sie eine Reihe von tun sehr nützliche Dinge, wie zum Beispiel Funktionen, die Prüfung und Änderung der Inhalte des Refs / Atom / anderer Dinge von Interesse gehalten in Vars, Aufruf von Funktionen / Java-Methoden usw. neu zu definieren.
Beachten Sie, dass Sie wahrscheinlich nicht in Ihrer (:use swank.swank)
Form ns
sollte; (:require swank.swank)
statt. Der Unterschied besteht darin, dass die ehemaligen zieht in allen swank.swank
öffentlichen Vars in Ihren Namensraum, während die letzteren nicht (use = require + refer
siehe (doc use)
usw. für weitere Details). Sie scheinen Namespace-qualifizierte Symbole für den Zugriff Swank Vars zu bedienen, so dass Sie nicht einmal könnte den Rest des Codes ändern müssen, und require
Vermeidet Ihren Namensraum unübersichtlich. Alternativ (:use [swank.swank :only [start-repl]])
; Dies zieht in genau der start-repl
Var, die Sie dann direkt, ohne die swank.swank/
Bit.