Clojure 如何在另一个命名空间中设置动态变量

Clojure 如何在另一个命名空间中设置动态变量,clojure,Clojure,我试图在不同的名称空间中定义一个动态变量。Lobos文档说明: 默认情况下,所有迁移都保存在lobos.migrations命名空间中。 它将由迁移命令自动加载,因此没有 你需要自己装。因此,要使用另一个名称空间,必须 更改lobos.migration/migrations-namespace动态变量 我不知道如何在我的新名称空间中设置动态变量 我可以通过(ns`lobos.migration)在repl中执行此操作,但是可以从我自己的ns运行此cmd (def ^:dynamic lobos

我试图在不同的名称空间中定义一个动态变量。Lobos文档说明:

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

我不知道如何在我的新名称空间中设置动态变量

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

(def ^:dynamic lobos.migration/*migrations-namespace* 'gb.install.migrations)
收益率
无法在当前ns之外创建DEF


如何修复此问题?

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

您可以使用
绑定
为当前线程临时创建每线程绑定:

(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的意愿设置var。

投大票,Chouser,但哇——最后一个版本是难以置信的巴洛克风格,因为我认为这是一个常规操作,尽管相对很少。全局参数设置不应该经常使用,但它们有自己的位置。例如,要更改
pprint
的输出宽度,我可以设置
clojure.pprint/*print right margin*
,但是上面描述的
alter var root
方法是我唯一可以使用的方法。