Если hello.clj
находится в $DIR
и $DIR
находится на вашем пути к классам, тогда hello.clj
должен начинаться с (ns hello)
. Если он находится в $DIR/$SUBDIR
и $DIR
находится на вашем пути к классам, то hello.clj должен начинаться с (ns $SUBDIR.hello)
. Как правило, структура вашего имени файла и структура имени ns должны совпадать, с разделителем имени файла, замененным на .
в имени ns, и любыми _
s в имени файла, соответствующими -
s в имени ns. Имя фактического файла должно быть последним компонентом (возможно, единственным компонентом, если файл, содержащий dir, находится в пути к классам) имени пространства имен.
EDIT:
Расширенный пример. Никакой информации помимо того, что я написал выше, поэтому, пожалуйста, пропустите ее, если вам этого достаточно; однако я знаю, что вначале получить СР было довольно больно, поэтому я решил написать это поэтапно, чтобы кто-нибудь где-нибудь мог избежать этого "опыта обучения" ;-).
Скажите, что это ваше определение пространства имен:
;;; in file "hello.clj"
(ns hello)
(defn hello []
(println "Hello!"))
Тогда, если вы поместите каталог, содержащий hello.clj
, в ваш путь к классам, вы можете пойти, и (use 'hello)
в REPL должен делать то, что вы хотите.
Если, с другой стороны, вы делаете это:
;;; in file "hello.clj"
(ns my-namespace)
;;; ...
или это:
;;; in file "my-filename.clj"
(ns hello)
;;; ...
- то есть, если вы введете несоответствие между именем файла и именем пространства имен, Clojure не сможет найти ваше пространство имен.
Кроме того, если вы положили hello.clj
в /path/to/code
, но на вашем пути к классам на самом деле /path/to
, то есть родительский каталог /path/to/code
, вам нужно сделать это:
;;; in file "/path/to/code/hello.clj"
(ns code.hello)
;;; ...
Тогда вы сможете (use 'code.hello)
.
Наконец, если вы называете свой файл my_namespace.clj
, вам нужно позвонить своему нс my-namespace
(и наоборот). _
s в именах пространства имен и -
s в именах файлов не должны использоваться.