2013-08-28 2 views

ответ

10

Новые var s временно создаются with-local-vars. Существующие var s временно восстанавливаются на with-bindings. В обоих случаях привязки являются поточно-локальными.

Обратите внимание, что with-bindings, насколько я могу судить, полезен в качестве помощника для передачи привязок из другого контекста с помощью карты, возвращаемой get-thread-bindings. Аналогичная функция binding будет более типичной, если не импортировать привязки.

Иллюстративных примеры:

(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

(с креплениями) ожидает, что ключи от привязок карты быть Варсом, а не символы. Он выталкивает заданную карту var/values ​​в стек локальных привязок потока и берется за , удаляя ее после возвращения данной функции. Это функция низкого уровня.

(with-local-vars) позволяет кодировать в императивном стиле (мутирующем состоянии).