如何在另一个命名空间中设置动态var

时间:2012-06-11 19:26:06

标签: clojure

我正在尝试在不同的命名空间中定义动态var。 Lobos文档说明:

  

默认情况下,所有迁移都保存在lobos.migrations命名空间中。   它会被迁移命令自动加载,所以没有   需要自己加载它。因此,要使用另一个名称空间   更改lobos.migration / 迁移命名空间动态变量。

我无法弄清楚如何在我的新命名空间中设置动态变量。

我可以在repl via(ns`lobos.migration)中执行此操作,但是从我自己的ns中运行此cmd

(def ^:dynamic lobos.migration/*migrations-namespace* 'gb.install.migrations)

收益Can't create defs outside of current ns

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:19)

Clojure vars可以拥有一个对所有线程都可见的根绑定。此外,动态变量也可以具有每个线程绑定,每个绑定只对一个线程可见。

您可以使用binding

临时为当前线程创建每线程绑定
(binding [lobos.migration/*migrations-namespace* 'gb.install.migrations]
  ;; binding is in effect here in the body of the binding form
  )

或者如果每个线程绑定已经生效,您可以使用set!更改其值:

(set! lobos.migration/*migrations-namespace* 'gb.install.migrations)

但是,您可能需要以所有线程中可见的方式更改此特定动态变量。如果是这样,您需要通过执行以下操作来更改其根绑定:

(alter-var-root #'lobos.migration/*migrations-namespace*
                (constantly 'gb.install.migrations))

注意我对lobos本身一无所知,所以不能肯定地说这些中的任何一个实际上都会以lobos的方式设置变量。