我编写了一个简单的宏,用于在调试时打印出表达式及其结果。
(defmacro dbg-print
"Print out values or expressions in context"
[& rest]
`(let [symb-str# (map str '~rest)
symb-evl# (list ~@rest)
pairs# (map #(str %1 %2 %3 %4) symb-str# (repeat ":") symb-evl# (repeat " "))
str# (reduce str pairs#)]
(printf "%s\n" str#)))
它的工作原理如下:
(defn my-func1
[arg]
(dbg-print (+ arg 1)))
(my-func1 1)
给出输出
(+ arg 1):2
然后我遇到了一个问题,我从索引中读到了一些东西:
(defn my-func2
[first & rest]
(dbg-print rest)
(nth rest 1))
(my-func2 1 2)
这根本不提供任何输出。如何在dbg-print宏下面出现错误,阻止它打印?我还注意到,如果我在宏中使用println和format而不是printf,那么错误就会消失。但我仍然想知道最新情况。
答案 0 :(得分:3)
这不是宏问题,而是I / O问题。在刷新stdio之前遇到异常。
printf
使用print
使用pr
而无需刷新。
println
使用prn
使用pr
,但在*flush-on-newline*
为true
时刷新。