2013-06-12 3 views
3

Я написал простой макрос для распечатки выражений и их результатов при отладке.Почему мой макрос не дает никакого вывода

(defmacro dbg-print 
    "Print out values or expressions in context" 
    [& rest] 
    `(let [symb-str# (map str '~rest) 
     symb-evl# (list [email protected]) 
     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 и формат вместо printf в макросе. Но я все равно хотел бы знать, что происходит.

ответ

3

Это не проблема с макросом, а проблема ввода-вывода. Вы сталкиваетесь с исключением, прежде чем stdio будет очищен.

printf использует print, который использует pr без промывки.

println использует prn, который использует pr но флеши когда *flush-on-newline* является true.

Смежные вопросы