, ev projelerimden birinde log4j kullanmaya başladı ve büyük bir modüldeki her işleve, (trace (str "entering: " function-name))
'u kesmek ve yapıştırmak üzereydim. sonra aklın sesi yakalandı ve “daha iyi bir yol var” dedi… Bir bütün fonksiyon bloğunu saran ve izleri onlara ya da buna benzer bir şey ekleyen bir makro yapmayı düşünebilir miyim? Bilge yığın-taşan-clojurians herhangi bir tavsiye?clojure: ad alanında her işlev için bir hata ayıklama izi ekleme?
17
A
cevap
17
bir makro gerek yoktur: benzer
(defn trace-ns
"ns should be a namespace object or a symbol."
[ns]
(doseq [s (keys (ns-interns ns))
:let [v (ns-resolve ns s)]
:when (and (ifn? @v) (-> v meta :macro not))]
(intern ns
(with-meta s {:traced true :untraced @v})
(let [f @v] (fn [& args]
(clojure.contrib.trace/trace (str "entering: " s))
(apply f args))))))
(defn untrace-ns [ns]
(doseq [s (keys (ns-interns ns))
:let [v (ns-resolve ns s)]
:when (:traced (meta v))]
(alter-meta! (intern ns s (:untraced (meta v)))
#(dissoc % :traced :untraced))))
... falan. En olası ekstra gereksinim, ifn?
s olmayan şeyler için trace
'u aramak için filter
kullanmak olacaktır. Güncelleme: buna bir çözüm olarak düzenlenmiş (aynı zamanda makroların işlenmesi). 2. Güncelleme: bazı büyük hatalar düzeltildi. 4 Güncellemesi: eklenmiş görüntüleme işlevselliği.
Güncelleme 3: İşte benim repl gelen bir örnek:
user> (ns foo)
nil
foo> (defn foo [x] x)
#'foo/foo
foo> (defmacro bar [x] x)
#'foo/bar
foo> (ns user)
nil
user> (trace-ns 'foo)
nil
user> (foo/foo :foo)
TRACE: "entering: foo"
:foo
user> (foo/bar :foo)
:foo
user> (untrace-ns 'foo)
nil
user> (foo/foo :foo)
:foo
İlgili konular
- 1. . * Clojure ad alanında
- 2. İsimsiz bir ad alanında işlev bildirimi koymak mümkün mü?
- 3. 'Anonim ad alanlarında' hata ayıklama (C++)
- 4. Hata ayıklama .NET'de çağrılan işlev
- 5. Visual Studio, global ad alanında olmayan işlev hakkında uyarı veriyor
- 6. XDocument, System.Xml ad alanında görünmüyor
- 7. Bir önişlemci makrosuyla hata ayıklama
- 8. Kütüphaneler/ad alanları için Clojure belgelendirmesi
- 9. Garip hata olduğunda Clojure
- 10. Neden gözükmüyor? clojure geçici vektörler için işlev?
- 11. DataContractSerializer'ı ad alanında mı bırakıyorsunuz?
- 12. C# WPF Eklenen Özellikler - Hata: "Özellik XML ad alanında bulunmuyor"
- 13. Varolan XDocument için bir ad alanı ekleme
- 14. İsim, ad alanında yok System.Drawing
- 15. Firefox'taki hata ayıklama hata ayıklama
- 16. Listeye nesne ekleme; İşlev gerçekleştirme, Özellik Hata
- 17. Hata ayıklama döngüleri
- 18. Clojure: ad alanının ismine gönderme
- 19. Paket ad alanında görünmeyen bir işlevi nasıl geçersiz kılarım?
- 20. ASP.Net Core, bir hata ayıklayıcıda hata ayıklama değil hata ayıklama
- 21. Bir Dizgeden Bir İşlev Çağrma İşlev Çağın İçinde Clojure ile
- 22. Geçerli ad alanında 'Uygulama' türü veya ad alanı yok
- 23. Ad alanında ad veya ad alanı adı mevcut değil (bir montaj başvurusu eksik misiniz?)
- 24. 'Hata ayıklama', 'Yazdırma' için bir tanım içermiyor
- 25. Clojure deftype parametreli bir işlev olarak kullanılıyor
- 26. Dinamik olarak oluşturulmuş bir ad alanına işlev eklemek için temiz bir yol var mı?
- 27. Clojure makroları ile bir işlev belirtme
- 28. Hata ayıklama haskell: Her çağrıda bir işlevin adını görüntüleme
- 29. Nasıl MvcApplication ve WebApiApplication bir ad alanında karıştırılır?
- 30. Neden System.IO ad alanında IsolatedStorage'a erişemiyorum?
Sadece Harikasın! ns-çözüm bölümünü açıklayabilir miydiniz? –
:-) 'ns-resol' bir ad alanı veya ad alanı-adlandırma sembolü ve bir sembol alır ve (ikinci) sembol tarafından verilen isim altında verilen isim alanında bulunan Var'ı bulmaya çalışır. Burada önemli olan nokta, (1) Var'ın kök bağlanmasını değiştirmek mümkündür (bunu yapmanın bir kaç yolu vardır, fakat 'intern' burada ekstra meta verileri nasıl işlediğinden dolayı özellikle uygundur; Özgün için sarılmış bir işlevi geri vermek için yeniden bağlama kullanır) ve (2) Var'ın meta verilerini değiştirmek mümkündür (yani 'untraced-ns' mümkündür). –
Yukarıdakilerin en son sürümü için http://gist.github.com/492764 adresine bakın (daha kullanışlı bir doküman hazırlamaya sahip!). –