Clojure не может найти .clj в локальном каталоге. и. /classes на CLASSPATH
Когда я оцениваю (используйте 'hello) для загрузки hello.clj, REPL жалуется на следующую ошибку:
java.io.FileNotFoundException: Could not locate hello__init.class or hello.clj on classpath: (NO_SOURCE_FILE:0)
Я вызываю REPL следующим образом:
java -cp "/Library/Java/Extensions/servlet-api-2.5-20081211.jar:... lots of jarfiles ...:/Library/Java/Extensions/clojure-contrib.jar:/Library/Java/Extensions/clojure-1.0.0.jar:./classes/:." jline.ConsoleRunner clojure.lang.Repl
Чтение, похоже, что файл не найден в PWD, но я добавил. на путь без успеха: - (.
Работа с Java 1.6 на OS X 10.6.
Я уверен, что я идиот, может кто-то ударил меня LART?
EDIT: я также попробовал ClojureX distro и получил те же результаты.
Ответы
Ответ 1
Если hello.clj
находится в $DIR
, а $DIR
находится в вашем пути к классу, то hello.clj
нужно начинать с (ns hello)
. Если он находится в $DIR/$SUBDIR
и $DIR
на вашем пути к классам, тогда hello.clj нужно начинать с (ns $SUBDIR.hello)
. Как правило, ваша структура имени файла и структура имени ns должны совпадать, а разделитель имен файлов заменяется на .
в имени ns и любом _
в имени файла, соответствующем -
в имени ns. Имя фактического файла должно быть конечным компонентом (возможно, единственным компонентом, если файл, содержащий dir, находится в пути к классам) имени пространства имен.
EDIT:
Расширенный пример. Нет информации, кроме того, что я написал выше, поэтому, пожалуйста, пропустите ее, если этого достаточно для вас; однако я знаю, что получение CP права было очень болезненным для меня в начале, поэтому я решил, что я напишу это поэтапно, чтобы кто-то, возможно, мог бы пощадить этот особый "опыт обучения";-).
Скажите, что это ваше определение пространства имен:
;;; 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
, вам нужно вызвать ns my-namespace
(и наоборот). _
в именах пространств имен и -
в именах файлов не должны использоваться.
Ответ 2
Содержит ли hello.clj оператор (ns some-namespace)
? Если это так, то same_namespace
добавляется к каждому элементу CLASSPATH перед поиском hello.clj
Ответ 3
когда я работаю из repl и хочу загрузить файлы, я нахожу, что должен сначала вызвать что-то вроде этого:
(add-classpath "file:///home/arthur/.../src/")
(add-classpath "file:///home/arthur/.../build/")
до того, как repl найдет их в пути к классам.
Я помещаю их в файл, который не включен в файл jar вместе с инструкцией, которая перезагружает все из других файлов. Когда я создаю файл jar, я считаю, что мне не нужно это делать.
Ответ 4
Я определил псевдоним (в .bash_profile) для загрузки REPL:
alias clojure='CLASSPATH=$HOME/git/clojure/clojure.jar:$HOME/git/clojure-contrib/clojure-contrib.jar:.:classes rlwrap java clojure.lang.Repl'
Ответ 5
У меня есть следующие строки на моем .emacs:
(setq swank-clojure-jar-path "~/src/clojure/clojure.jar"
swank-clojure-extra-classpaths (append
(directory-files "~/src/compojure/deps" t ".jar$")
(list
"~/src/swank-clojure/src/main/clojure"
"~/src/clojure-contrib/clojure-contrib.jar"
"~/src/clj/.")))
Загружаю программу snake.clj, которая находится в ~/src/clj и eval it (C-x h, которая выбирает весь буфер, а затем C-c C-c для компиляции). Программы создают пространство имен по имени змея. Теперь, из emacs/slime, я делаю
(use 'snake)
Это it.Now вызывает любую функцию, определенную в пространстве имен.
Ваша проблема может заключаться в том, что каталог, на котором у вас есть hello.clj, может быть не на вашем пути к классам. Также убедитесь, что вы правильно назвали пространство имен. Если внутри hello.clj, вы назвали свое пространство имен в качестве приветствия, тогда вы это сделаете (используйте "привет" ).