2011-10-22 9 views
8

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

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

+2

この質問はhttps://groups.google.com/forum/#!forum/midjeに再掲載すると効果があります。 – user100464

答えて

10

のClojure 1.3でも、動的に宣言されていないVARSと連携して、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]))) 
関連する問題