Se hello.clj
è in $DIR
e $DIR
è sul classpath, quindi hello.clj
deve iniziare con (ns hello)
. Se è in $DIR/$SUBDIR
e $DIR
è nel classpath, quindi hello.clj deve iniziare con (ns $SUBDIR.hello)
. In generale, la struttura del nome del file e la struttura del nome ns devono corrispondere, con il separatore di file sostituito da .
nel nome ns e qualsiasi _
s nel nome file corrispondente a -
s nel nome ns. Il nome del file effettivo deve essere il componente finale (probabilmente l'unico componente, se il file contenente la dir è sul classpath) del nome dello spazio dei nomi.
EDIT:
Un esempio esteso. Nessuna informazione al di là di ciò che ho scritto sopra, quindi per favore saltane sopra se è sufficiente per te; tuttavia so che ottenere il CP giusto è stato abbastanza doloroso per me all'inizio, quindi ho deciso di scrivere questo in modo graduale in modo che qualcuno, da qualche parte, potesse forse essere risparmiato da quella particolare "esperienza di apprendimento" ;-).
dicono che questa è la sua definizione dello spazio dei nomi:
;;; in file "hello.clj"
(ns hello)
(defn hello []
(println "Hello!"))
Quindi se si mette la directory che contiene hello.clj
sul classpath, siete pronti per andare a un (use 'hello)
al REPL dovrebbe fare quello che vuoi.
Se, d'altra parte, si esegue questa operazione:
;;; in file "hello.clj"
(ns my-namespace)
;;; ...
o questo:
;;; in file "my-filename.clj"
(ns hello)
;;; ...
- vale a dire, se si introduce una mancata corrispondenza tra il nome del file e il nome dello spazio dei nomi, Clojure non sarà in grado di trovare il tuo spazio dei nomi.
Inoltre, se si mette in hello.clj
/path/to/code
, ma quello che avete sul vostro percorso di classe è in realtà /path/to
, vale a dire la directory padre di /path/to/code
, è necessario fare questo:
;;; in file "/path/to/code/hello.clj"
(ns code.hello)
;;; ...
Allora sarete in grado a (use 'code.hello)
.
Infine, se si chiama il file my_namespace.clj
, è necessario chiamare il numero my-namespace
(e viceversa). _
s nei nomi degli spazi dei nomi e nei nomi dei file -
non devono essere utilizzati.
Cosa uscita si ottiene da: (println (SEQ (.getURLs (java.lang.Classloader/getSystemClassLoader)))) –
Dal mio dir Clojure (/ Users/Ben/Documents/Codice/Clojure), ottengo questo : (# ... più urls per jarfiles ... # # # ) –
afternoon
poiché non ho visto questo dichiarato esplicitamente da qualche parte ancora e potrebbe avere rilevanza dove si trova il file ciao.clj? anche cosa succede se corri (compile 'ciao)? –