2013-08-28 4 views

Odpowiedz

10

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... 
2

(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).