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

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

最佳答案

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

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

println 使用 prn,它使用 pr,但当 *flush-on-newline* 时刷新>true.

关于macros - 为什么我的宏没有给出任何输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17071781/

相关文章:

clojure - 在 Clojure 中如何组合排序和过滤?

c - 通过实现定义的宏识别 clang、gcc 和 tcc

macros - Haxe 自定义元数据到宏调用

emacs - 如何在 emacs 缩写模式下将 a\string 替换为非反斜杠字符串?

clojure - 教堂数字的阶乘函数

java - 如何缓存文件句柄?

python - 有没有办法使用 Clojure 或 Lein 启动 Python 程序?

java - clojure 中的子类

lisp - 帮我写一个 Clojure 宏,它会自动将元数据添加到函数定义中

c - 宏作为另一个宏的参数