clojure.core имеет макросы bindings и with-redefs. Глядя на docstrings и примеры на clojuredocs.org, они, похоже, делают что-то очень похожее. В чем разница и какую пользу я должен использовать в ситуациях?Clojure: привязка против-redefs
ответ
Clojure Vars может иметь резьбовые локальные привязки. binding
использует их, в то время как with-redefs
фактически изменяет привязку корня (что похоже на значение по умолчанию) var.
Другое отличие состоит в том, что binding
работает только для :dynamic
vars, а with-redefs
работает для всех варов.
Примеры:
user=> (def ^:dynamic *a* 1)
#'user/*a*
user=> (binding [*a* 2] *a*)
2
user=> (with-redefs [*a* 2] *a*)
2
user=> (binding [*a* 2] (doto (Thread. (fn [] (println "*a* is " *a*))) (.start) (.join)))
*a* is 1
#<Thread Thread[Thread-2,5,]>
user=> (with-redefs [*a* 2] (doto (Thread. (fn [] (println "*a* is " *a*))) (.start) (.join)))
*a* is 2
#<Thread Thread[Thread-3,5,]>
Вы можете использовать (без документов) binding-conveyor-fn
передать внутрипотоковые привязки в новые темы:
user=> (binding [*a* 2] (doto (Thread. (#'clojure.core/binding-conveyor-fn (fn [] (println "*a* is " *a*)))) (.start) (.join)))
*a* is 2
#<Thread Thread[Thread-5,5,]>
Все это почему 'with-redefs' предназначено для использования в тестах (там, где вы можете захотеть получить и закрыть функцию), которая «привязка» может быть полезна в производственном коде как w флигель. – Peeja
- 1. Clojure макросы и привязка символов
- 2. Clojure привязка динамического var не работает как ожидалось
- 3. Принудительная инъекция, привязка, привязка
- 4. Редактор Clojure, написанный на Clojure
- 5. Clojure ленивая функция - Clojure Koan
- 6. Простой Clojure/см ошибки компиляции Clojure метания
- 7. Lein Clojure 1.3 vs Clojure 1.2.1
- 8. Clojure: llegalArgumentException в несоответствии типа повторения Clojure
- 9. clojure + appengine-magic java.lang.NoClassDefFoundError: clojure/lang/IFn
- 10. Почему я получаю сообщение об ошибке «Неподдерживаемая привязка» при реализации протокола в clojure?
- 11. привязка href привязка к угловым маршрутам
- 12. Entity Framework - привязка объектов - привязка свойств навигации?
- 13. ListView двухсторонняя скомпилированная привязка (x: привязка)
- 14. Является ли привязка или условная привязка сильнее?
- 15. WPF-привязка: привязка к родительскому объекту DataContext
- 16. wpf привязка данных - двусторонняя привязка со строкой?
- 17. Разница между x: привязка и привязка
- 18. Clojure MACROEXPAND
- 19. Преимущества Clojure
- 20. Clojure OutOfMemoryError
- 21. Закрытие Clojure
- 22. Clojure sprintf?
- 23. Clojure + Lemur
- 24. Clojure: документация
- 25. Компиляция Clojure?
- 26. Clojure stripMargin
- 27. Clojure fibonacci
- 28. Развертывание Clojure?
- 29. Clojure: = против ==
- 30. Clojure серии
Смотрите также вопрос: http://stackoverflow.com/ Вопросы/15747774/whats-the-point-of-define-something-as-dynamic-when-you-dont-need-to-define/15748334 # 15748334 – Alex