每当我尝试在家用计算机(OSX)上使用(加载文件)时,都会抛出以下错误:
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:除了OS,两个系统都运行JRE 1.7_025并使用clojure-1.5.1。
更新: 我被要求进行堆栈跟踪,我不知道如何开始使用Clojure。但是emacs nrepl-error buffer为我列出了这个:
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
更新:找出今天的问题。我遇到了与我的Windows框完全相同的问题,原来的答案是正确的,但我认为它与(加载文件)有关的错误。我加载的文件有一个函数,它不使用vector []作为函数本身的一部分。当加载文件检查语法以确保文件中的所有内容都已完成时,Clojure正在做正确的事情(但我完全忘记了这一点)。我的功能不是这样,它不会加载文件。我忘了LISP这样做了,这是一个特征而不是一个bug(我喜欢LISP的原因)。
我是新手,但不是LISP,我应该意识到这一点。该文件是我的学习档案。我从REPL重新输入的所有示例为什么要学习并使用最新版本重新加载文件以确保我输入正确的文件。看来,当我向文件添加最新的函数时,我重新输入错误并且没有重新加载文件来检查它。当我离开并关闭REPL然后在晚餐后回来并试图重新加载文件时它将无法加载。
很抱歉浪费时间。但感谢你的帮助,也很快。原来的答案是正确的我只是忘了重新检查文件中的所有功能。
答案 0 :(得分: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)
可能是两个系统的代码不一样吗?
路径解释/
与\
之间是否存在差异导致其他内容被加载?