3

我编写了一个简单的宏,用于在调试时打印出表达式及其结果。

(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,错误就会消失。但我还是想知道发生了什么。

4

1 回答 1

3

这不是宏观问题,而是 I/O 问题。在刷新 stdio 之前遇到异常。

printf无需冲洗即可使用print的用途。pr

println使用prnwhich 使用pr但在*flush-on-newline*is时刷新true

于 2013-06-12T17:46:48.010 回答