2012-06-11 20 views
9

異なる名前空間に動的なvarを定義しようとしています。別の名前空間に動的なvarを設定する方法

デフォルトでは、すべての移行はlobos.migrations名前空間に保持されます。 移行コマンドによって自動的にロードされるため、 は自分でロードする必要はありません。したがって、別の名前空間を使用するには、 lobos.migration/migrations-namespace動的変数を変更する必要があります。

私は新しい名前空間内から動的変数を設定する方法を理解できません。

私は(NS `lobos.migration)を介してREPLでこれを行うが、私自身、NS

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

からこのCMDを実行すると、Can't create defs outside of current nsを生み出すことができます。

どうすればこの問題を解決できますか?

答えて

18

Clojure varsには、すべてのスレッドから見えるルートバインディングを設定できます。さらに、動的変数はスレッドごとのバインディングを持つこともでき、それぞれが1つのスレッドにしか見えません。

あなたは一時的に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の欲望の方法でvarを設定します。

+0

私は比較的まれではあるが、日常的に起こるだろうと思う操作のために、その最後のバージョンは信じられないほどバロックです。グローバルなパラメータ設定はあまり使用しないでください。たとえば、 'pprint'の出力幅を変更するには' clojure.pprint/* print-right-margin * 'を設定できますが、上記の 'alter-var-root'メソッドは私が得た唯一のメソッドです働く – Mars

関連する問題