2010-07-13 12 views
5

Sto iniziando l'apprendimento di Clojure ed Emacs. Io ho Clojure Box per Windows in esecuzione e vorrei essere in grado di scrivere codice in un buffer quindi eseguirlo nel REPL, senza haveing ​​chiamareReload Clojure files in emacs

(use 'example.code) 

tutto il tempo. So di C-c C-k ma non ricarica lo spazio dei nomi. Se io uso

(in-ns 'example.code) 

per cambiare spazio dei nomi nel repl funziona. Qual è il modo giusto per farlo?

risposta

10

in-ns è uno dei modi giusti.

Il modo che mi sembra più "giusto" è quello di (require '[example.code :as ec]) e lavorare nello spazio dei nomi user al REPL; in questo modo il mio stato sperimentale usa e getta rimane in user e ec/foo è abbastanza conveniente per me (e lo rende ovvio da dove dovrebbe venire foo). Puoi sempre dire (require :reload-all 'example.code) (stesso lavoro con use) per forzare la ricompilazione.

Inoltre, ecco una funzione per rimuovere (dallo spazio dei nomi corrente) tutte le mappature tirato in da un dato spazio dei nomi con use:

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

In cima a che si potrebbe costruire

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

e dì (reuse 'example.code) per ottenere qualcosa di simile a un nuovo inizio con il tuo spazio dei nomi. (Si noti che 1,2 nuove funzionalità come deftype & defrecord introdurre alcune complessità ... In particolare, unuse non ha alcun effetto sulla classe import ndr -. Questo include i record e deftype tipi -Creato :reload-all provoca ancora il deftype et al forme di essere. ricompilato, ma ricordo di aver trovato casi strani in cui questo non sembra essere abbastanza ... Forse il mio errore, forse qualche aspetto arcano di queste caratteristiche non l'ho ancora completamente esplorato.)

0

Forse il modo "sporco" è semplicemente passare allo spazio dei nomi del buffer nel repl con (ns 'example.code). Sporche si mescolano le definizioni del buffer con quelle repl. Penso che la risposta di Marczyk sia quella giusta.

+0

Anche in-ns è il "modo giusto" per cambiare spazio dei nomi, non ns. si suppone che ns venga chiamato una sola volta per impostare lo spazio dei nomi con tutte le sue richieste, usi e importazioni. Quando questo è fatto, in-ns è usato per cambiare lo spazio dei nomi. – kotarak

+0

hai ragione, mi manca il in-ns, più adatto per il repl – jneira