为什么我的宏没有给出任何输出

时间:2013-06-12 17:37:17

标签: macros clojure

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

(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,那么错误就会消失。但我仍然想知道最新情况。

1 个答案:

答案 0 :(得分:3)

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

printf使用print使用pr而无需刷新。

println使用prn使用pr,但在*flush-on-newline*true时刷新。