You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

疑问点

  • 是否遗漏了必要的配置项?
  • 报错是否因为varx仅在字符串内部被引用,没有其他外部使用场景,因此在编译阶段被移除?

解决方案

问题核心和编译阶段移除变量无关,是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 09:39:03