2012-01-15 14 views
5

だから私は現在、このコードを持っている:私はEmacsでC-c C-kを実行した後Clojureのシンボル評価エラー

(ns contact-form.core 
    (:gen-class)) 

(def foo "Hello World!") 

(defn some-func [a-symbol] 
    (println (str a-symbol "'s value is: " (eval a-symbol)))) 

(defn -main [& args] 
    (some-func 'foo)) 

は、私は次のような出力を得る:

contact-form.core> (-main) 
foo's value is: Hello World! 
nil 

をしかし、私はlein uberjarを行い、その結果を実行するとjarファイルでエラーが発生しました:

Exception in thread "main" java.lang.RuntimeException: Unable to resolve symbol: foo in this context, compiling:(NO_SOURCE_PATH:0) 
    at clojure.lang.Compiler.analyze(Compiler.java:6235) 
    at clojure.lang.Compiler.analyze(Compiler.java:6177) 
    at clojure.lang.Compiler.eval(Compiler.java:6469) 
    at clojure.lang.Compiler.eval(Compiler.java:6431) 
    at clojure.core$eval.invoke(core.clj:2795) 
    at contact_form.core$some_func.invoke(core.clj:7) 
    at contact_form.core$_main.doInvoke(core.clj:10) 
    at clojure.lang.RestFn.invoke(RestFn.java:397) 
    at clojure.lang.AFn.applyToHelper(AFn.java:159) 
    at clojure.lang.RestFn.applyTo(RestFn.java:132) 
    at contact_form.core.main(Unknown Source) 
Caused by: java.lang.RuntimeException: Unable to resolve symbol: foo in this context 
    at clojure.lang.Util.runtimeException(Util.java:156) 
    at clojure.lang.Compiler.resolveIn(Compiler.java:6720) 
    at clojure.lang.Compiler.resolve(Compiler.java:6664) 
    at clojure.lang.Compiler.analyzeSymbol(Compiler.java:6625) 
    at clojure.lang.Compiler.analyze(Compiler.java:6198) 
    ... 10 more 

私は2つの質問があります:

  1. uberjarがREPLとまったく同じ機能を果たしないのはなぜですか?
  2. この問題を解決するにはどうすればよいですか?

答えて

5

1.なぜuberjarの機能がREPLと異なっていますか?

"NO_SOURCE_PATH"というエラーの原因は、現在、 'foo'を定義した名前空間にないことです。私は私のREPLで自分のコードを評価し、それを実行した場合(ns contact-form.core)はREPLによって評価されるので、あなたが期待するように、それはcontact-form.core名前空間に私を置くが、私はuser名前空間に切り替えて、I -mainを呼び出す場合:

説明するために、

contact-form.core=> (-main) 
foo's value is: Hello World! 
nil 
contact-form.core=> (ns user) 
nil 
user=> (contact-form.core/-main) 
CompilerException java.lang.RuntimeException: Unable to resolve symbol: foo in this context, compiling:(NO_SOURCE_PATH:120) 
user=> 

ので、(REPL外)スタンドアロンuberjarの実行のためにmainにあなたのエントリポイントを指定することによって、それがあるため、clojure.coreであるあなたのjarファイルのデフォルトの名前空間から(contact-form.core/-main)を呼び出すことと同じです。同じエラーを生成することができます(ns contact-form.core)は評価されていません。結果:mainは、関数への完全修飾(名前空間)パスを使用して実行できますが、contact-form.coreのシンボルは現在のデフォルト名前空間で使用できません。

2.修正

ソリューションは、明示的に最初にあなたの名前空間に切り替えることであろう。:

(defn -main [& args] 
    (use 'contact-form.core) 
    (some-func 'foo)) 
+1

'use'だけの名前空間を切り替えるよりもはるかを行います。私は ''(binding [* ns *(the-ns 'contact-form.core)](some-func' foo)) '' – Chouser

+0

@chouserをお勧めします。私は啓発されたと考えています! :-) – Scott

関連する問題