4

自宅のコンピューター (OSX) で (load-file) を使用しようとすると、次のエラーがスローされます。

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") の違いは何ですか? スラッシュを使用したパス構造以外は異なりますが、これが両方のシステムで機能しない理由がわかりません。

ところで:OS以外の両方のシステムは、clojure-1.5.1でJRE 1.7_025を実行しています。

更新: スタック トレースを求められましたが、これを行う方法がわかりません。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ボックスでまったく同じ問題を抱えていましたが、元の答えは正しいことがわかりましたが、(load-file)に関係しているという私の仮定は正しくありませんでした。読み込んでいたファイルには、関数自体の一部としてベクトル [] を使用していない関数がありました。Clojure は正しいことをしていました (しかし、私はこれを完全に忘れていました)。私の機能はそうではなかったので、ファイルをロードしませんでした。LISP がこれを行うことと、これがバグではなく機能であることを忘れています (私が LISP を好きな理由)。

私は clojure は初めてですが、LISP は初めてなので、これに気付くべきでした。ファイルは私の研究ファイルです。REPL から再入力したすべての例を調査し、ファイルを最新のものでリロードして、正しく入力したことを確認します。最新の関数をファイルに追加したときに、間違って再入力し、ファイルを再ロードしてチェックしなかったようです。私が立ち去ってREPLを閉じ、夕食後に戻ってきてファイルをリロードしようとすると、ロードされませんでした。

時間の無駄で申し訳ありません。しかし、助けてくれてありがとう。元の答えは正しかったので、ファイル内のすべての関数を再チェックするのを忘れていました。

4

1 に答える 1

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) ではなく文字列を取ります 2 つのシステムでコードが同じでない可能性がありますか?
パスの解釈と何か他のものをロードさせることに違いはあります/\?

于 2013-06-26T00:13:30.963 に答える