2010-11-17 6 views
23

Dans clojure J'ont des lignes comme celle-ci qui définissent les valeurs par défaut:Dans clojure, comment puis-je annuler une var d'un espace de noms?

(def *http-port* 8080) 

J'ai décidé de formaliser ce genre de valeurs dans une unité de configuration et je voudrais annuler la définition de la valeur *http-port* afin que je puisse trouver les emplacements qui se réfèrent toujours à cette valeur et modifiez-les pour utiliser la nouvelle valeur. Je fais un refactoring en d'autres termes en déplaçant la valeur à un endroit différent.

La façon dont je l'ai fait est de quitter slime et essayer de redémarrer la session slime. Pendant la phase de compilation de maven, des erreurs comme celles-ci sont détectées et je peux trouver et corriger une référence à la fois. Je répare ensuite l'erreur, lave rinçage et répète. C'est évidemment frustrant.

Comment ferais-je cela en étant connecté à une session slime?

Répondre

33

Si je vous comprends bien, ns-unmap devrait faire ce que vous voulez:

user=> foo 
java.lang.Exception: Unable to resolve symbol: foo in this context (NO_SOURCE_FILE:1) 
user=> (def foo 1) 
#'user/foo 
user=> foo 
1 
user=> (ns-unmap (find-ns 'user) 'foo) 
nil 
user=> foo 
java.lang.Exception: Unable to resolve symbol: foo in this context (NO_SOURCE_FILE:1) 
+7

D'autres espaces de noms peuvent encore contenir des références à la valeur de « foo. –

+2

@Jurgen c'est vrai, mais la solution est mieux que rien –

+0

Juste pour se souvenir: l'espace de noms par défaut est 'clojure.core –

Questions connexes