2014-04-01 28 views
2

獲取有關動態無功未解決了從動態無功,綁定,命名空間的可視性

設置始發命名空間從正水平調用時:

File a.clj 
----------- 
(ns a) 

(def ^:dynamic *poof* "poof") 

(def x [1 '*poof* 3]) 

(defn- func-wbind [new-term] 
    (binding [*poof* new-term] 
    (println (eval x)))) 

(defn with-term [term] 
    (println x) 
    (println (eval x)) ; <== *** FAILS HERE *** 
    (func-wbind term)) 

File b.clj 
----------- 
(ns b 
(:require [a :refer :all])) 

(defn woof-it [] 
    (with-term "woof")) 

File c.clj 
----------- 
(ns c 
(:require [b :refer :all])) 

(defn try-it [] 
    (woof-it)) 

加載REPL以「C」,並要求嘗試,失敗在未解決的動態變量。

任何幫助將不勝感激。

編輯:以上修改和可重複的錯誤。

堆棧跟蹤:

ERROR in (endpoint-tests) (Compiler.java:6380) 
Default 
expected: (map? (endpoint-abstractions ep-any "www.yahoo.com")) 
    actual: clojure.lang.Compiler$CompilerException: java.lang.RuntimeException: Unable to resolve symbol: *ph* in this context, compiling:(gl_ep/epref_tests.clj:17:1) 
at clojure.lang.Compiler.analyze (Compiler.java:6380) 
    clojure.lang.Compiler.analyze (Compiler.java:6322) 
    clojure.lang.Compiler$HostExpr$Parser.parse (Compiler.java:948) 
    clojure.lang.Compiler.analyzeSeq (Compiler.java:6560) 
    clojure.lang.Compiler.analyze (Compiler.java:6361) 
    clojure.lang.Compiler.analyze (Compiler.java:6322) 
    clojure.lang.Compiler.analyzeSeq (Compiler.java:6555) 
    clojure.lang.Compiler.analyze (Compiler.java:6361) 
    clojure.lang.Compiler.analyze (Compiler.java:6322) 
    clojure.lang.Compiler$BodyExpr$Parser.parse (Compiler.java:5708) 
    clojure.lang.Compiler$FnMethod.parse (Compiler.java:5139) 
    clojure.lang.Compiler$FnExpr.parse (Compiler.java:3751) 
    clojure.lang.Compiler.analyzeSeq (Compiler.java:6558) 
    clojure.lang.Compiler.analyze (Compiler.java:6361) 
    clojure.lang.Compiler.eval (Compiler.java:6616) 

    clojure.lang.Compiler.eval (Compiler.java:6582) 
    clojure.core$eval.invoke (core.clj:2852) 
    gl_ep.html_extract$glg_hfm_transform$fn__5320$fn__5321.invoke (html_extract.clj:35) 
    hickory.select$attr$fn__5193.invoke (select.clj:220) 
    clojure.lang.AFn.applyToHelper (AFn.java:161) 
    clojure.lang.AFn.applyTo (AFn.java:151) 
    clojure.lang.AFunction$1.doInvoke (AFunction.java:29) 
    clojure.lang.RestFn.invoke (RestFn.java:408) 
    hickory.select$ordered_adjacent$fn__5271.invoke (select.clj:481) 
    hickory.select$select_next_loc.invoke (select.clj:134) 
    hickory.select$select_next_loc.invoke (select.clj:129) 
    hickory.select$select_next_loc.invoke (select.clj:127) 
    hickory.select$select_locs.invoke (select.clj:143) 
    hickory.select$select.invoke (select.clj:154) 
    gl_ep.html_extract$hickory_get.invoke (html_extract.clj:66) 
    gl_ep.html_extract$mapglg$fn__5363.invoke (html_extract.clj:76) 
    clojure.core$map$fn__4207.invoke (core.clj:2485) 
    clojure.lang.LazySeq.sval (LazySeq.java:42) 

    clojure.lang.LazySeq.seq (LazySeq.java:60) 
    clojure.lang.RT.seq (RT.java:484) 
    clojure.core$seq.invoke (core.clj:133) 
    clojure.core$map$fn__4207.invoke (core.clj:2479) 
    clojure.lang.LazySeq.sval (LazySeq.java:42) 
    clojure.lang.LazySeq.seq (LazySeq.java:60) 
    clojure.lang.RT.seq (RT.java:484) 
    clojure.core$seq.invoke (core.clj:133) 
    clojure.core$apply.invoke (core.clj:617) 
    gl_ep.html_extract$mapglg.invoke (html_extract.clj:73) 
    gl_ep.html_extract$extract.invoke (html_extract.clj:87) 
    gl_ep.endpoint$abstractions.doInvoke (endpoint.clj:59) 
    clojure.lang.RestFn.invoke (RestFn.java:423) 
    gl_ep.endpoint$endpoint_abstractions.doInvoke (endpoint.clj:68) 
    clojure.lang.RestFn.invoke (RestFn.java:423) 
    gl_ep.epref_tests$fn__8816$fn__8817.invoke (epref_tests.clj:10) 
    gl_ep.epref_tests/fn (epref_tests.clj:10) 
    clojure.test$test_var$fn__7145.invoke (test.clj:701) 
    clojure.test$test_var.invoke (test.clj:701) 
    clojure.test$test_all_vars$fn__7149$fn__7156.invoke (test.clj:717) 

    clojure.test$default_fixture.invoke (test.clj:671) 
    clojure.test$test_all_vars$fn__7149.invoke (test.clj:717) 
    clojure.test$default_fixture.invoke (test.clj:671) 
    clojure.test$test_all_vars.invoke (test.clj:713) 
    clojure.test$test_ns.invoke (test.clj:736) 
    clojure.core$map$fn__4207.invoke (core.clj:2487) 
    clojure.lang.LazySeq.sval (LazySeq.java:42) 
    clojure.lang.LazySeq.seq (LazySeq.java:60) 
    clojure.lang.Cons.next (Cons.java:39) 
    clojure.lang.RT.boundedLength (RT.java:1654) 
    clojure.lang.RestFn.applyTo (RestFn.java:130) 
    clojure.core$apply.invoke (core.clj:619) 
    clojure.test$run_tests.doInvoke (test.clj:751) 
    clojure.lang.RestFn.invoke (RestFn.java:408) 
    clojure.test$run_tests.invoke (test.clj:749) 
+0

適用於Clojure 1.5.1和1.6。我的第一個想法是在一個新的REPL中再次嘗試。 – Alex

+0

@Alex - 我在1.5.1並嘗試過多次REPL加載無效 –

+0

您可以發佈堆棧跟蹤嗎? – Alex

回答

4

eval一種形式,在該形式不合格符號在當前名字空間被解決在運行時(如由clojure.core/*ns*定義),的命名空間,其中所述致電eval已編譯。所以符號*poof*在REPL命名空間中解析。這適用於名稱空間b,因爲您在要求a時執行了:refer :all,因此在b中創建了a/*poof*的本地別名。在c中不存在這樣的別名,因此解析該符號失敗。

有幾個選項可以解決這個問題。你可以改變的x聲明使用命名空間限定符號:

(def x [1 'a/*poof* 3])` 

或者,您可以撥打電話到eval具有約束力的*ns*到命名空間a

(def x [1 '*poof* 3]) 

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

,然後通過調用local-eval取代調用eval

請參閱Clojure documentation以獲取有關在評估過程中如何解析符號的更詳細說明。

+0

符合所引用的使用作品。感謝您的鏈接。 –