我编写了一个简单的宏,用于在调试时打印表达式及其结果。
(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 ,错误就会消失。但我还是想知道到底发生了什么。
最佳答案
这不是宏问题,而是 I/O 问题。在刷新 stdio 之前您遇到异常。
printf
使用 print
,而 print
使用 pr
而无需刷新。
println
使用 prn
,它使用 pr
,但当 *flush-on-newline*
为 时刷新>true
.
关于macros - 为什么我的宏没有给出任何输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17071781/