2012-06-11 11 views
9

Ich versuche, eine dynamische Variable in einem anderen Namespace zu definieren. Die Lobos-Dokumentation lautet:So legen Sie eine dynamische Variable in einem anderen Namespace fest

Standardmäßig werden alle Migrationen im Namespace lobos.migrations gespeichert. Es wird automatisch durch Migrationsbefehle geladen, so dass es keine braucht, um es selbst zu laden. Um einen anderen Namespace zu verwenden, müssen Sie daher die Variable lobos.migration/migrations-namespace dynamischer Variable ändern.

Ich kann nicht herausfinden, wie die dynamische Variable aus meinem neuen Namespace gesetzt wird.

Ich kann dies über (ns `lobos.migration) in der ers tun, aber dieses cmd aus meiner eigenen ns

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

ergibt Can't create defs outside of current ns läuft.

Wie kann ich das beheben?

Antwort

18

Clojure vars kann eine für alle Threads sichtbare Stammbindung aufweisen. Darüber hinaus können dynamische vars auch pro-Thread-Bindungen haben, die jeweils nur für einen Thread sichtbar sind.

Sie vorübergehend erstellen können eine Pro-Thread-Bindung für Ihren aktuellen Thread unter Verwendung binding:

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

Oder wenn ein Pro-Thread-Bindung bereits in Kraft ist, können Sie seinen Wert set! mit ändern:

Es ist jedoch wahrscheinlich, dass Sie diese bestimmte dynamische Variable in einer Weise ändern müssen, die in allen Threads sichtbar ist. Wenn dies wahr ist, dann müssen Sie ihre Wurzel etwas wie diese Bindung ändern, indem Sie:

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

Hinweis Ich weiß nichts über lobos selbst und so kann nicht mit Sicherheit sagen, dass jede von ihnen werden tatsächlich setzen sie die var so, wie lobos es wünscht.

+0

Große Abstimmung, Chouser, aber wow - diese letzte Version ist unglaublich barock, für eine Operation, von der ich denke, dass sie routinemäßig auftreten würde, wenn auch relativ selten. Globale Parametereinstellungen sollten nicht oft verwendet werden, aber sie haben ihren Platz. Um beispielsweise die Ausgabebreite von 'pprint' zu ändern, kann ich' clojure.pprint/* print-right-margin * 'setzen, aber die oben beschriebene' alter-var-root' Methode ist die einzige Methode, die ich bekommen habe arbeiten. – Mars

Verwandte Themen