上記のコードは、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が名前空間の修飾シンボルを含む式を返した場合、私は思うが問題は解決するだろうが、読み取り文字列は
これは動作しますが、私は名前空間が分からない場合はどうしますか? evalはシンボルを解決できる環境マップを取るべきです。 – sonwh98
varを定義しているので、定義されている場所を知っている必要がありますか? – tarmes
ええ、文脈とは、問題を解決するためにシンボルテーブルを使用する必要がある式と値を含むファイルにヒカップが格納されていることです。 evalを呼び出す人は、シンボルテーブルが置かれている名前空間を指定する必要はありません。それはapiを醜いものにします。たとえば、(eval-hiccup(read-string a-file){:answer 42、age:10000000})を呼びたいと思います。シンボルテーブルのキーとしてネームスペースを渡すとうまくいくはずですが、apiをハッキリにします – sonwh98