2017-11-08 10 views
0

上記のコードは、replで実行されたときに期待通りに動作します。それは、しかしclojure動的バインディング、読み取り文字列と評価シンボルを解決できません

cpress.hsp> (answer) 
"blah"                                              
[:h1 42] 

を返し、それがHTTP-キットによりスレッド産卵に実行されたとき、私はREPLでこれをシミュレートするために、シンボル

Exception in thread "Thread-43" 
java.lang.RuntimeException: Unable to resolve symbol: symbol-table in this context, compiling:(NO_SOURCE_PATH:0:0) 
     at clojure.lang.Compiler.analyze(Compiler.java:6792) 
     at clojure.lang.Compiler.analyze(Compiler.java:6729) 
     at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3874) 
     at clojure.lang.Compiler.analyzeSeq(Compiler.java:7005) 
     at clojure.lang.Compiler.analyze(Compiler.java:6773) 

を解決することができません取得を実行するスレッドを生成します応答関数

(.. (Thread. answer) start) 

なぜこれが起こりますか、それを修正する方法はありますか?

いくつかの実験では、名前空間のためにシンボルを見つけることができないことが示されています。 は、たとえば、代わりに読み取り、文字列からの発現を得るための、私は最初のevalは働く引用構文を使用してリテラル

(defn answer2 [] 
    (binding [symbol-table {:answer 42}] 
     (prn (eval `[:h1 (:answer symbol-table)])) ;;works                                  
     ;;(eval '[:h1 (:answer symbol-table)]) ;; does not works                                
    )) 

に入れて、私は引用定期的に使用する場合には動作しません。構文引用は名前空間を解決しますが、通常の引用は行いません。 read-stringが名前空間の修飾シンボルを含む式を返した場合、私は思うが問題は解決するだろうが、読み取り文字列は

答えて

0

となります。 (関数が定義されている名前空間のものではない)。この問題を解決するには

、あなたが必要なものにバインドされた名前空間にはevalのバージョンを作成することができます

(defn local-eval [x] 
    (binding [*ns* (find-ns 'my-namespace)] 
    (eval x))) 

(もちろん、あなたが正しい名前を反映するためにmy-namespaceを変更する必要があります)。代わりにそれを使用してください:

(defn answer [] 
    (binding [symbol-table {:answer 42}] 
    (-> "[:h1 (:answer symbol-table)]" read-string local-eval))) 
+0

これは動作しますが、私は名前空間が分からない場合はどうしますか? evalはシンボルを解決できる環境マップを取るべきです。 – sonwh98

+0

varを定義しているので、定義されている場所を知っている必要がありますか? – tarmes

+0

ええ、文脈とは、問題を解決するためにシンボルテーブルを使用する必要がある式と値を含むファイルにヒカップが格納されていることです。 evalを呼び出す人は、シンボルテーブルが置かれている名前空間を指定する必要はありません。それはapiを醜いものにします。たとえば、(eval-hiccup(read-string a-file){:answer 42、age:10000000})を呼びたいと思います。シンボルテーブルのキーとしてネームスペースを渡すとうまくいくはずですが、apiをハッキリにします – sonwh98

関連する問題