Clojure的load-string在lein repl正常运行但lein run执行报错如何解决
Clojure lein run执行时load-string找不到声明变量问题解决
问题复现
在Clojure开发过程中遇到如下异常场景:
- 使用
lein repl命令启动REPL环境后,运行greet函数可得到预期结果,相关代码如下:
(ns var-test.core (:gen-class)) (declare ^:dynamic x) (defn greet [] (binding [x "Hello World."] (println (load-string "x")))) (defn -main [& args] (greet))
- 使用
lein run命令执行上述代码,会抛出如下报错:
java.lang.RuntimeException: Unable to resolve symbol: x in this context.
疑问点
- 是否遗漏了必要的配置项?
- 报错是否因为var
x仅在字符串内部被引用,没有其他外部使用场景,因此在编译阶段被移除?
解决方案
问题核心和编译阶段移除变量无关,是load-string的默认执行上下文导致的:默认情况下load-string会在全新的空白命名空间中加载执行内容,无法识别当前var-test.core命名空间下声明的x变量。
只需要在binding块中额外绑定*ns*动态变量,指定load-string使用当前业务逻辑的命名空间执行即可,修改后可正常运行的代码如下:
(ns var-test.core (:gen-class)) (declare ^:dynamic x) (defn greet [] (binding [x "Hello World." *ns* (find-ns 'var-test.core)] (println (load-string "x")))) (defn -main [& args] (greet))
内容的提问来源于stack exchange,提问作者branch14
相关产品推荐
相关产品推荐

