2013-06-25 1 views
3

Всякий раз, когда я пытаюсь использовать (нагрузка-файл) на моем домашнем компьютере (OSX) он выдает следующее сообщение об ошибке:Clojure (нагрузка-файл) выдает ошибку

IllegalArgumentException Parameter declaration comp should be a vector clojure.core/assert-valid-fdecl (core.clj:6732)

Когда я загрузить тот же файл на моем ящике Windows на работе он работает. В чем разница между (load-file «C: \ clojure \ pc-3.clj») и (load-file «/Users/myname/clojure/pc-3.clj»), который выдает ошибку. Другое, чем структура пути с косой чертой, отличается, но я не понимаю, почему это не работает на моих обеих системах.

BTW: кроме ОС обе системы работают JRE 1.7_025 с clojure-1.5.1.

ОБНОВЛЕНИЕ: Меня попросили найти трассировку стека, и я не уверен, как это сделать, только что начал работать с Clojure. Но буфер Emacs nrepl ошибок перечислены это для меня:

java.lang.ClassCastException: clojure.lang.PersistentVector cannot be cast to java.lang.String RT.java:318 clojure.lang.RT$3.invoke NO_SOURCE_FILE:1 user/eval278 Compiler.java:6619 clojure.lang.Compiler.eval Compiler.java:6582 clojure.lang.Compiler.eval core.clj:2852 clojure.core/eval main.clj:259 clojure.main/repl[fn] main.clj:259 clojure.main/repl[fn] main.clj:277 clojure.main/repl[fn] main.clj:277 clojure.main/repl RestFn.java:1096 clojure.lang.RestFn.invoke interruptible_eval.clj:56 clojure.tools.nrepl.middleware.interruptible-eval/evaluate[fn] AFn.java:159 clojure.lang.AFn.applyToHelper AFn.java:151 clojure.lang.AFn.applyTo core.clj:617 clojure.core/apply core.clj:1788 clojure.core/with-bindings* RestFn.java:425 clojure.lang.RestFn.invoke interruptible_eval.clj:41 clojure.tools.nrepl.middleware.interruptible-eval/evaluate interruptible_eval.clj:171 clojure.tools.nrepl.middleware.interruptible-eval/interruptible-eval[fn] core.clj:2330 clojure.core/comp[fn] interruptible_eval.clj:138 clojure.tools.nrepl.middleware.interruptible-eval/run-next[fn] AFn.java:24 clojure.lang.AFn.run ThreadPoolExecutor.java:1145 java.util.concurrent.ThreadPoolExecutor.runWorker ThreadPoolExecutor.java:615 java.util.concurrent.ThreadPoolExecutor$Worker.run Thread.java:724 java.lang.Thread.run

UPDATE: Найдено, что эта проблема сегодня. У меня возникла такая же проблема с моим окном Windows, что исходный ответ был прав, но мое предположение о том, что это связано с (load-file), было неправильным. Файл, который я загружал, имел функцию, которая не использовала вектор [] как часть самой функции. Clojure делал правильную вещь (но я совсем забыл об этом) при загрузке файла, проверяющего синтаксис, чтобы убедиться, что все было заполнено в файле. Моя функция не была такой, чтобы она не загружала файл. Я забыл, что LISP делают это, и что это особенность, а не ошибка (причина, почему мне нравятся LISP).

Я новичок в clojure, но не в LISP, и я должен был это осознать. Файл является моим учебным файлом. Все примеры, которые я перепечатываю из REPL, почему изучают и перезагружают файл с помощью новейшего, чтобы убедиться, что я набрал его правильно. Похоже, что когда я добавил новую функцию в файл, я перепечатал ее неправильно и не перезагрузил файл, чтобы проверить его. Когда я ушел и закрыл REPL, а затем вернулся после обеда и попытался перезагрузить файл, он не загрузится.

Так жаль, что это пустая трата времени. Но спасибо за помощь, и быстро. Первоначальный ответ был правильным, я просто забыл перепроверить все функции в файле.

+0

какая версия Clojure (так что я могу посмотреть на правильную строку 6732) –

+0

вы могли бы включить больше трассировки стека? Таким образом, я вижу, что это проблема с запуском компилятора или проблема, обнаруженная компилятором в файле. –

+0

Это все, что было напечатано – macshaggy

ответ

4

Эта ошибка указывает на то, что компилятор что-то обработка как

(defn function-name comp (do-stuff ...)) 

или, возможно,

(defn [arg1] comp (do-stuff ...)) 

вместо

(defn function-name [comp] (do-stuff ...)) 

load-file принимает строку не вектор (load-file "path/to/file.clj) Может это что co de не то же самое на двух системах?
Может ли быть разница в интерпретации пути / vs \ что-то другое загружается?

+0

. Я знаю, что я проверил документ, и он сказал, чтобы использовать load-файл как таковой: '(load-file [name])', но это дает мне ошибка 'ClassCastException clojure.lang.PersistentVector не может быть передана в java.lang.String clojure.lang.RT $ 3.invoke (RT.java:318)' – macshaggy

+0

На самом деле эта ошибка появляется только в коде типа '(defn foo (comp ...)) 'или' (defn [] (comp ...)) ', а не в любых случаях, о которых вы догадались. – amalloy

+0

оба из них являются недопустимыми выражениями. должен быть (defn foo [arg1] ((comp function1 function2) arg1)) –

Смежные вопросы