2014-04-01 34 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

符合所引用的使用作品。感谢您的链接。 –