私はClojureを1ヶ月前に使い始めました。私の統合テストでは、関数が他の関数から呼び出されたかどうかを調べるための小さなマクロを開発しました。マクロは、現在、次のようになります。関数が呼び出されたかどうかを確認するClojureマクロ
(defmacro called?
[f val body]
(let [flag (gensym `flag)]
`(with-redefs-fn
{~f (fn [& rest#] (def ~flag nil) ~val)}
#(do
(try
(~body)
(catch Throwable e#))
(if (resolve '~flag)
(bound? (resolve '~flag))
false)))))
使用法:
user=> (called? #'clojure.core/println nil #(println "hey"))
true
user=> (called? #'clojure.core/println nil #(print "hey"))
heyfalse
スタックを爆発させずに元の実装を呼び出す方法はありますか?私はあなたの目標は、このようなマクロを自分で書くこと、または既存のライブラリを使用することができているかどうかわからないです私は最初let
にこのような何かをしようとしたが、これはClassCastException clojure.lang.Cons cannot be cast to java.util.concurrent.Future
(let [flag (gensym `flag)
orig-f# (deref f)] ...)