8

私はTDDについてClojureinActionの第8章を読んでいて、スタブマクロを試しました。動的バインディングメカニズムを使用して関数をスタブします。残念ながら、Clojure 1.3では、非動的変数にバインディングメカニズムを使用することはできないため、関数動的を指す変数を明示的に宣言しない限り、ほとんどの場合、スタブマクロは機能しません。次に、Midjeでスタブがどのように行われるのか疑問に思い、「提供された」のソースを見つけようとしましたが、見つかりませんでした。だからここに行きます:

Midjeでは、実際に「提供」はどのように実装されていますか?誰かがこれを詳細に説明できますか?

4

1 に答える 1

10

Clojure 1.3は、動的に宣言されていないvarでも機能する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])))
于 2011-11-09T17:03:56.037 に答える