【问题标题】:Clojure: Debugging Println, __LINE_NUMBER__ and __FILE_NAME__Clojure:调试 Println、__LINE_NUMBER__ 和 __FILE_NAME__
【发布时间】:2012-06-08 23:49:51
【问题描述】:

上下文

目前,

(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_ ?

谢谢。

【问题讨论】:

    标签: clojure


    【解决方案1】:
    (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 有 printf —— 不再像 (println (apply str .... )) 这样的废话了
    • 如果使用lein run -m your.main.classclojure.main -m your.main.class*file* 为零。
    【解决方案2】:

    log4jlogback 这样的Java 日志框架提供了这种功能。您可以配置日志系统以将行号添加到日志消息中。文件名可能比较难,但至少你可以在那里有命名空间。

    您可以使用clojure.logging 为日志框架提供良好的接口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-27
      • 2014-12-05
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-05
      相关资源
      最近更新 更多