Eine eingebettete Swank-clojure repl Zugriff auf das Programm es in eingebettet ist?

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

  •  30-09-2019
  •  | 
  •  

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:

Embedding Swank-clojure in Java-Programm

War es hilfreich?

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.

verwenden könnte
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top