2012-06-11 12 views
9

Próbuję zdefiniować dynamiczny var w innym obszarze nazw. Dokumentacja Lobos stwierdza:Jak ustawić dynamiczny var w innym obszarze nazw

Domyślnie wszystkie migracje są przechowywane w przestrzeni nazw lobos.migrations. Zostanie automatycznie załadowany przez polecenia migracji, więc nie ma potrzeby ładowania go samodzielnie. Tak więc, aby użyć innej przestrzeni nazw, musisz zmienić zmienną dynamiczną lobos.migration/migrations-namespace.

Nie mogę dowiedzieć się, jak ustawić zmienną dynamiczną z mojej nowej przestrzeni nazw.

mogę to zrobić w repl poprzez `lobos.migration (NS), ale działa to cmd z moich własnych ns

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

plony Can't create defs outside of current ns.

Jak mogę to naprawić?

Odpowiedz

18

Clojure vars może mieć powiązanie root widoczne dla wszystkich wątków. Dodatkowo zmienne zmienne mogą również zawierać powiązania dla wątków, z których każdy jest widoczny tylko dla jednego wątku.

Można tymczasowo tworzyć wiązania per-wątku dla bieżącego wątku za pomocą binding:

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

Lub jeśli nitki za wiążące jest już w rzeczywistości, można zmienić jej wartość za pomocą set!:

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

Ale prawdopodobnie będziesz musiał zmienić ten konkretny dynamiczny var w sposób widoczny we wszystkich wątkach. Jeśli to prawda, to trzeba zmienić wiążącej swoje korzenie robiąc coś takiego:

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

Uwaga Nie wiem nic na temat samego Lobos a więc nie można z całą pewnością powiedzieć, że każdy z nich będzie właściwie ustawić var ​​w sposób, w jaki pragnie lobos.

+0

Wielkie głosowanie w górę, Chouser, ale wow - ta ostatnia wersja jest niewiarygodnie barokowa, dla operacji, która moim zdaniem miałaby miejsce rutynowo, choć stosunkowo rzadko. Globalne ustawienia parametrów nie powinny być używane dużo, ale mają swoje miejsce. Na przykład, aby zmienić szerokość wyjściową 'pprint', mogę ustawić' clojure.pprint/* print-right-margin * ', ale metoda' alter-var-root' opisana powyżej jest jedyną metodą, którą otrzymałem pracować. – Mars

Powiązane problemy