2016-03-24 5 views

risposta

1

nel REPL (solo a partire clojure) Ho il seguente ns caricato di default

user=> (pprint (map #(.getName %) (all-ns))) 
(clojure.edn 
clojure.core.server 
clojure.java.io 
clojure.java.shell 
clojure.core.protocols 
clojure.string 
clojure.java.browse 
clojure.pprint 
clojure.uuid 
clojure.core 
clojure.main 
user 
clojure.java.javadoc 
clojure.repl 
clojure.walk 
clojure.instant) 

in qualsiasi spazio dei nomi ci si trova, clojure.edn sembra non essere caricato

8

programmi Clojure partono parte superiore della " main "namespace (spesso project-name.core) e valuta ogni modulo dall'alto verso il basso. Ciò accade all'avvio del programma e prima che vengano invocate le funzioni "principali".

Quando viene valutata un'espressione require, passa a tale spazio dei nomi e fa la stessa cosa lì. Se è necessario incontrarsi lì ricorre giù rami di tali spazi dei nomi, in modo ricorsivo caricando ogni spazio dei nomi come richiesto.

Quindi, se non si specifica esplicitamente che il proprio spazio dei nomi richiede un altro spazio dei nomi, allora si è in balia dell'ordine che gli altri namspace che si richiedono caricano le loro dipendenze. A volte funzionerà e le modifiche a volte non correlate all'ordine di evacuazione delle dipendenze distanti interromperanno il codice .

Quindi, per favore, per favore ... dichiarate le vostre esigenze!

+0

Stai dicendo che se uso, diciamo 'clojure.string/ends-with? 'Solo una volta in un file, dovrei comunque mettere' (richiede' clojure.string) 'in alto? – glts

+2

Sì! e più probabilmente metterlo nella forma ns in alto nella sezione (: require ...). come questo '[clojure.string: refer [finisce-con?]]' Non è necessario farlo per clojure.core, anche se tutto il resto è una buona abitudine che aiuterà coloro che lavorano sul tuo codice negli anni a venire avere vite più felici –