2010-07-13 8 views
5

Je commence tout juste à apprendre Clojure et Emacs. J'ai Clojure Box pour les fenêtres en cours d'exécution et je voudrais être en mesure d'écrire du code dans un tampon puis exécutez dans le REPL sans haveing ​​appelerRecharger les fichiers Clojure dans emacs

(use 'example.code) 

tout le temps. Je connais C-c C-k mais cela ne recharge pas l'espace de noms. Si j'utilise

(in-ns 'example.code) 

pour changer l'espace de noms dans le repl fonctionne. Quel est le bon moyen de le faire?

Répondre

10

in-ns est l'une des bonnes façons.

Le chemin qui me semble le plus "correct" est de (require '[example.code :as ec]) et de travailler dans l'espace de noms user au REPL; de cette façon, mon état expérientiel jetable reste en user et ec/foo est assez pratique pour moi (et il est évident d'où vient foo). Vous pouvez toujours dire (require :reload-all 'example.code) (fonctionne également avec use) pour forcer la recompilation.

De plus, voici une fonction pour supprimer (de l'espace de noms en cours) tous les mappings tirés depuis un espace de noms donné avec use:

(defn unuse [ns] 
    (doseq [[n v] (ns-refers *ns*)] 
    (if (= (.. v ns name) ns) 
     (ns-unmap *ns* n)))) 

En plus de cela, vous pouvez construire

(defn reuse [ns] 
    (unuse ns) 
    (remove-ns ns) 
    (use :reload-all ns)) 

et dites (reuse 'example.code) pour obtenir quelque chose près d'un nouveau départ avec votre espace de noms. (Notez que 1.2 de nouvelles fonctionnalités telles que deftype & defrecord introduisons quelques complexités ... En particulier, unuse n'a pas d'effet sur import classe Ed. - ce qui inclut les dossiers et deftype types -Création :reload-all provoque toujours les deftype formes et al être. recompilé, mais je me souviens avoir frappé des cas bizarres où cela ne semblait pas être suffisant ... Peut-être mon erreur, peut-être un aspect mystérieux de ces caractéristiques que je n'ai pas encore complètement exploré.)

0

est simplement passer à l'espace de noms du tampon dans le repl avec (exemple.code ns). Sale parce que vous mélangez les définitions de tampons avec celles de repl. Je pense que la réponse de Marczyk est la bonne.

+0

Egalement in-ns est la "bonne façon" de changer d'espace de noms, pas ns. ns est supposé être appelé une seule fois pour configurer l'espace de noms avec tous ses require, use et import. Lorsque cela est fait, in-ns est utilisé pour changer l'espace de noms. – kotarak

+0

vous avez raison, je manque l'in-ns, plus approprié pour le repl – jneira

Questions connexes