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

Dus*_*etz 9 clojure

我试图在不同的命名空间中定义动态var.Lobos文档指出:

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

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

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

(def ^:dynamic lobos.migration/*migrations-namespace* 'gb.install.migrations)
Run Code Online (Sandbox Code Playgroud)

收益率Can't create defs outside of current ns.

我怎样才能解决这个问题?

Cho*_*ser 19

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

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

(binding [lobos.migration/*migrations-namespace* 'gb.install.migrations]
  ;; binding is in effect here in the body of the binding form
  )
Run Code Online (Sandbox Code Playgroud)

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

(set! lobos.migration/*migrations-namespace* 'gb.install.migrations)
Run Code Online (Sandbox Code Playgroud)

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

(alter-var-root #'lobos.migration/*migrations-namespace*
                (constantly 'gb.install.migrations))
Run Code Online (Sandbox Code Playgroud)

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