x is 10-6ren">
gpt4 book ai didi

Clojure:调试 Println、__LINE_NUMBER__ 和 __FILE_NAME__

转载 作者:行者123 更新时间:2023-12-03 00:06:47 24 4
gpt4 key购买 nike

上下文

目前,

(println "x is" x)

直接打印

x is 10

现在,我想要的是这样的:

(my-println "x is" x)

打印出来:

foo.clj:23> x is 10

非正式地说,我希望 my-println 将 _FILE_NAME_ 和 _LINE_NUMBER_ 附加到我的 println 中。

问题:

我知道如何使用宏。但是,我不知道如何从 Clojure 中的当前位置提取 _FILE_NAME_ 和 _LINE_NUMBER_ (而 C 宏使这变得很简单)。如何获取当前的 FILE_NAME_ 和 _LINE_NUMBER_?

谢谢。

最佳答案

(defmacro my-println [x]
`(do (printf "%s:%s> %s is %s\n"
~*file*
~(:line (meta &form))
~(pr-str x)
~x)
(flush)))
<小时/>

稍后再看这个答案,如果您愿意,您可以更聪明一点,通过在编译时插入字符串常量来降低运行时成本:

(defmacro my-println [x]
`(println ~(format "%s:%s> %s is"
*file*
(:line (meta &form))
(pr-str x))
~x))

从宏展开中可以看出,不再需要在运行时调用相对昂贵的 printf 代码:

(let [x 5] (macroexpand '(my-println (+ x 5))))
(clojure.core/println "foo.clj:1> (+ x 5) is" (+ x 5))

关于Clojure:调试 Println、__LINE_NUMBER__ 和 __FILE_NAME__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10957257/

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