2010-06-27 5 views
4

J'essaie d'intégrer un repli swank-clojure dans mon application dans le but de se connecter pendant que l'application est en train de courir. Cependant, j'ai de la difficulté à trouver comment accéder à l'environnement d'enfermement après avoir démarré le repl.Est-ce qu'un swank-clojure repl intégré peut accéder au programme dans lequel il est intégré?

Intégrer le Swank-Clojure REPL est assez facile:

(ns mytest 
    (:use [swank.swank :exclude [-main]]) 
    (:gen-class)) 

(defn -main [& args] 
    (let [x 123] 
    (swank.swank/start-repl))) 

Exécutez le programme .. puis sur emacs:

M-x slime-connect 

Cela fonctionne très bien et je suis connecté. Maintenant, ce que je espérais était que cela fonctionnerait:

(println x) 
;; 123 (what I was hoping for) 
;; Unable to resolve symbol: x in this context (cruel reality) 

Donc cela ne fonctionne pas comme un moyen de passer l'environnement actuel au REPL intégré.

Est-il possible que le REPL intégré interagisse avec mon programme en cours d'exécution?

Sinon, quelles sont les raisons pour intégrer un REPL?

Si cela fait une différence, j'essaye de l'exécuter en tant que JAR.

Ce fil semble lié, mais je ne pouvais arriver à quelque chose de lui:

Embedding swank-clojure in java program

Répondre

5

let habitants liØes sont scope lexicalement, ainsi swank.swank/start-repl ne seront pas affectés par une forme let enveloppé autour de l'appel à cela. Cependant, le REPL en cours d'exécution pourra require/use tous les espaces de noms Clojure sur le chemin de classe de votre application (ou utiliser in-ns pour basculer l'espace de noms REPL vers l'un de ceux-ci) et import toutes les classes Java sur le chemin de classe, vous permettant de des choses très utiles, comme la redéfinition des fonctions, l'examen et la modification du contenu des refs/atomes/autres choses d'intérêt a eu lieu à Vars, les fonctions d'appel/méthodes Java, etc.

Note que vous ne devriez pas probablement (:use swank.swank) dans votre ns forme; (:require swank.swank) à la place. La différence est que le premier tire dans tous les Vars publics de swank.swank dans votre espace de noms, tandis que le dernier ne le fait pas (use = require + refer, voir (doc use) etc. pour plus de détails). Vous semblez utiliser des symboles qualifiés pour l'espace de noms pour accéder au Vars de Swank, donc vous n'aurez peut-être même pas besoin de changer le reste de votre code, et require évite d'encombrer votre espace de noms. En variante, (:use [swank.swank :only [start-repl]]); ceci n'introduit que le start-repl Var, que vous pouvez ensuite utiliser directement, sans le bit swank.swank/.

+1

Merci pour votre réponse Michal et pour avoir signalé les problèmes dans mon: use /: require use. Votre commentaire sur les espaces de noms était la clé. J'avais déjà essayé (def x) et cela ne semblait pas fonctionner * parce que mon REPL était dans le mauvais espace de noms. Pour d'autres personnes qui sont intéressées, quelque chose comme ça semble fonctionner .. (def x (atome nul)) (defn -main [& args] (faire (reset! X "123") (start-swank))) Puis exécutez, connectez slime, et dans le REPL, assurez-vous de passer à l'espace de noms de droite: (ns "quoi que") – allclaws

Questions connexes