Na podstawie wiersza poleceń potrzebuję ustawić niektóre stałe czasu wykonywania, które będą używane z wieloma funkcjami downstream. Kod w tych funkcjach może być wykonywany w innych wątkach, więc nie rozważam kombinacji "zadeklaruj i użyj powiązanego makra". Jakie są plusy i minusy używania var (z alter-var-root) w tym przypadku w porównaniu do użycia atomu? Oznacza to, żeZmienna versus atom dla stałych runtime
(declare *dry-run*) ; one of my constants
(defn -main [& args]
; fetch command line option
;(cli args ...)
(alter-var-root #'*dry-run* (constantly ...))
(do-stuff-in-thread-pool))
kontra
(def *dry-run* (atom true))
(defn -main [& args]
; fetch command line option
;(cli args ...)
(reset! *dry-run* ...)
(do-stuff-in-thread-pool))
Jeśli nie ma innej opcji poza tymi dwoma, które należy wziąć pod uwagę, chciałbym wiedzieć.
Ponadto, wolałbym nie podawać początkowego val do atomu, ponieważ chcę ustawić wartości domyślne w innym miejscu (z inwokacją cli), ale mogę z tym żyć, zwłaszcza jeśli użycie atomu oferuje korzyści w porównaniu do alternatywy (alternatywnych).
Dzięki za wskazówkę. Czy wartość dostarczona do obietnicy będzie widoczna we wszystkich wątkach (automatyczne przenoszenie wiązań), czy też muszę zrobić coś specjalnego? – Don
Wiążący transport nie wchodzi w ogóle do obrazu za nic oprócz vars. Obietnica to po prostu obiekt Clojure, który, gdy zostanie odwołany, wygeneruje wartość, która została mu dostarczona, lub zablokuje, dopóki taka wartość nie nadejdzie. Wątki nie są bardziej istotne niż byłyby, gdybyś zdefiniował globalną mapę skrótów. – amalloy