If hello.clj
is in $DIR
and $DIR
is on your classpath, then hello.clj
needs to start with (ns hello)
. If it's in $DIR/$SUBDIR
and $DIR
is on your classpath, then hello.clj needs to start with (ns $SUBDIR.hello)
. Generally, your filename structure and the ns name structure must match, with filename separator replaced by .
in ns name and any _
s in the filename corresponding to -
s in the ns name. The name of the actual file needs to be the final component (possibly the only component, if the file's containing dir is on the classpath) of the namespace name.
EDIT:
An extended example. No information beyond what I've written above, so please skip over it if that was enough for you; however I know that getting CP right was quite painful for me in the beginning, so I decided I'd write this out in a step by step fashion so that someone, somewhere might perhaps be spared that particular `learning experience' ;-).
Say this is your namespace definition:
;;; in file "hello.clj"
(ns hello)
(defn hello []
(println "Hello!"))
Then if you put the directory containing hello.clj
on your classpath, you're good to go and a (use 'hello)
at the REPL should do what you want.
If, on the other hand, you do this:
;;; in file "hello.clj"
(ns my-namespace)
;;; ...
or this:
;;; in file "my-filename.clj"
(ns hello)
;;; ...
-- that is, if you introduce a mismatch between the name of the file and the name of the namespace, Clojure won't be able to find your namespace.
Also, if you put hello.clj
in /path/to/code
, but what you have on your classpath is actually /path/to
, i.e. the parent directory of /path/to/code
, you need to do this:
;;; in file "/path/to/code/hello.clj"
(ns code.hello)
;;; ...
Then you'll be able to (use 'code.hello)
.
Finally, if you call your file my_namespace.clj
, you need to call your ns my-namespace
(and the other way around). _
s in namespace names and -
s in filenames should not be used.