Dokumentacja Clojure with-local-vars
i with-bindings
nie wystarczy mi do rozróżnienia tych dwóch. Jakieś wskazówki?Różnica między z lokalnym-vars i z powiązaniami w Clojure
Odpowiedz
Nowe var
s są tymczasowo tworzone przez with-local-vars
. Istniejące var
s są tymczasowo odbijane ponownie przez with-bindings
. W obu przypadkach powiązania są wątkowo-lokalne.
Należy zauważyć, że with-bindings
jest, o ile wiem, przede wszystkim przydatny jako pomocnik do przekazywania wiązań z innego kontekstu przy użyciu mapy zwróconej przez get-thread-bindings
. Podobna funkcja, binding
, byłaby bardziej typowa, gdyby nie importować powiązań.
Przykłady:
(binding [*out* (new java.io.StringWriter)]
(print "world!") (str "hello, " *out*))
;=> "hello, world!"
(with-local-vars [*out* (new java.io.StringWriter)]
(print "world!") (str "hello," *out*))
;=> world!"hello,#<Var: --unnamed-->"
(with-local-vars [foo (new java.io.StringWriter)]
(.write @foo "world") (str "hello, " @foo))
;=> "hello, world"
(binding [foo (new java.io.StringWriter)]
(.write @foo "world") (str "hello, " @foo))
;=> CompilerException java.lang.RuntimeException:
; Unable to resolve var: foo in this context...
(z-wiązanie) oczekuje klucze wiązania mapa do Vars nie symbole. Przekazuje podaną mapę var/values na stos powiązań lokalnych wątków i dba o to, aby usunął ją po zwróceniu danej funkcji. Jest to funkcja niskiego poziomu.
(with-local-vars) umożliwia kodowanie w trybie rozkazującym (stan mutacji).
Nie uważam, że "powiązanie dynamiczne" jest używane poprawnie dla twojego pytania – Chiron