gpt4 book ai didi

clojure:为命名空间中的每个函数添加调试跟踪?

转载 作者:行者123 更新时间:2023-12-03 14:08:22 25 4
gpt4 key购买 nike

刚开始在我的一个家庭项目中使用 log4j,我正要打破鼠标并剪切和粘贴 (trace (str "entering: " function-name))进入大模块中的每个功能。然后理性的声音 catch 来并说“必须有更好的方法”......我可以考虑制作一个包装整个函数 block 并将跟踪添加到它们的宏或类似的东西?明智的 Stack-overflowing-clojurians 有什么建议吗?

最佳答案

不需要宏:

(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))))

...或类似的东西。最可能的额外要求是使用 filter以免调用 trace关于不是 ifn? 的事情s。更新:在解决方案中进行了编辑(也处理宏)。更新 2:修复了一些主要错误。更新 4:添加了 untrace 功能。

更新 3:这是我的 REPL 中的一个示例:
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

关于clojure:为命名空间中的每个函数添加调试跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3346382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com