【问题标题】:Why I'm getting Can't dynamically bind non-dynamic var?为什么我无法动态绑定非动态变量?
【发布时间】:2012-02-11 02:51:48
【问题描述】:

我正在尝试使用 clojure.tools.trace 命名空间的 dotrace 函数。

(dotrace [my-function] (my-function 5))

但是我收到了这个错误:

IllegalStateException 无法动态绑定非动态变量:my-ns/my-function clojure.lang.Var.pushThreadBindings (Var.java:339)

这是什么意思?为什么我会得到它?

(我使用的是 Clojure 1.3)

【问题讨论】:

  • 能否也指定my-function的代码?

标签: clojure


【解决方案1】:

我认为您需要将您的函数声明为动态绑定,例如

(def ^:dynamic my-function
   (fn [x] .....))

这样做的原因是,如果您不明确要求动态 var,Clojure(1.3 及更高版本)会将其设为非动态作为性能优化。

【讨论】:

  • 谢谢!但这不应该是defn吗?
  • defdefn 都可以,您可以使用其中任何一个来定义您的功能(已编辑以明确)
猜你喜欢
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多