Как «обеспечено» реализовано в Мидже? - PullRequest
8 голосов
/ 22 октября 2011

Я читал Clojure в главе 8 «Действие» о TDD и экспериментировал с макросом-заглушкой.Он использует механизм динамического связывания для заглушки функций.Увы, в Clojure 1.3 невозможно использовать механизм привязки для нединамических переменных, поэтому макрос-заглушка в большинстве случаев не работает, если только вы явно не объявите var, который указывает на функцию dynamic.Потом я удивился, как в Мидже делается окурка, и попытался найти источник «предоставлено», но не смог его найти.Итак, вот так:

Как «обеспечивается» реализовано в факте в Мидже?Может кто-нибудь объяснить это подробно?

1 Ответ

10 голосов
/ 09 ноября 2011

Clojure 1.3 предоставляет макрос with-redefs, который работает даже с переменными, которые не были объявлены динамическими:

user=> (def this-is-not-dynamic)
user=> (with-redefs [this-is-not-dynamic 900] this-is-not-dynamic)
900

Для обратной совместимости Midje использует свою собственную версию, чьи кишки выглядят так:

(defn alter-one-root [[variable new-value]]
   (if (bound? variable) 
     (let [old-value (deref variable)]
       (alter-var-root variable (fn [current-value] new-value))
       [variable old-value])
     (do
       (.bindRoot variable new-value)
       [variable unbound-marker])))
...