Документация для Clojure with-local-vars
и with-bindings
не достаточна для того, чтобы отличить их. Любые намеки?Разница между локальными варами и связями в Clojure
ответ
Новые 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...
(с креплениями) ожидает, что ключи от привязок карты быть Варсом, а не символы. Он выталкивает заданную карту var/values в стек локальных привязок потока и берется за , удаляя ее после возвращения данной функции. Это функция низкого уровня.
(with-local-vars) позволяет кодировать в императивном стиле (мутирующем состоянии).
Я не думаю, что «динамическая привязка» используется правильно для вашего вопроса – Chiron