2012-06-11 11 views
9

Estoy tratando de definir una var dinámica en un espacio de nombres diferente. La documentación de Lobos indica:Cómo establecer una var dinámica en otro espacio de nombres

De forma predeterminada, todas las migraciones se guardan en el espacio de nombres lobos.migrations. Se cargará automáticamente por los comandos de migración, por lo que no es necesario que lo cargue. Por lo tanto, para usar otro espacio de nombre debe cambiar la variable dinámica lobos.migration/migrations-namespace.

No puedo averiguar cómo configurar la variable dinámica desde mi nuevo espacio de nombres.

que pueda hacer esto en el repl a través de (ns `lobos.migration), pero el funcionamiento de este cmd de mis propios ns

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

rendimientos Can't create defs outside of current ns.

¿Cómo puedo solucionar esto?

Respuesta

18

Clojure vars puede tener un enlace de raíz visible para todos los hilos. Además, los vars dinámicos también pueden tener enlaces por subproceso, cada uno visible solo para un subproceso.

Puede crear temporalmente una por hilos de unión para el subproceso actual utilizando binding:

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

O si una unión de rosca por-que ya está en vigor, puede cambiar su valor usando set!:

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

Pero es probable que necesite cambiar esta var dinámica específica de una manera visible en todos los hilos. Si esto es cierto, tendrá que cambiar su raíz de enlace al hacer algo como esto:

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

Nota No sé nada acerca de lobos en sí y por lo tanto no se puede decir con certeza que ninguno de estos se en realidad establece la var en la forma en que lobos desea.

+0

Big vote up, Chouser, pero guau, esa última versión es increíblemente barroca, para una operación que yo pensaría que ocurriría rutinariamente, aunque sea con relativa poca frecuencia. La configuración de parámetros globales no debe usarse mucho, pero tienen su lugar. Por ejemplo, para cambiar el ancho de salida de 'pprint', puedo configurar' clojure.pprint/* print-right-margin * ', pero el método' alter-var-root' descrito anteriormente es el único método que he obtenido trabajar. – Mars

Cuestiones relacionadas