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, вы назвали свое пространство имен в качестве приветствия, тогда вы это сделаете (используйте "привет" ).