Я использую CIDER, если это имеет значение.Macroexpanded form оценивает, но исключает исключение формы исключений
(defmacro trace [prompt x]
(let [p (subs prompt 4)
expanded (macroexpand x)]
(cond (seq? expanded) `(do (println ~p '~x "...")
(let [result ~(map #(if (or (not (symbol? %)) (function? %))
(list 'trace (join [prompt prompt]) %)
%) expanded)]
(println ~p result "->" ~expanded))
~expanded)
:else expanded)))
Это макрос, над которым я работаю, но это не должно иметь значения (хотя, вероятно, это так).
Это конкретный фрагмент кода, который вызывает проблему
(trace " " (if true 6 4))
Оценки этого прямыми броски исключение:
Can't let qualified name: clj-match.trace/result
Я macroexpanded формы для отладки, и я получил это:
(do
(println "" '(if true 6 4) "...")
(let* [result (if true 6 4)] (println "" result "->" (if true 6 4)))
(if true 6 4))
Это не выглядит плохо, поэтому я попытался оценить расширенную форму. Неожиданно это сработало, оценив до 6.
Почему это происходит?
Что еще более важно, что я делаю неправильно, чтобы получить исключение?
@Elogent о, извините, я не копировал последнюю строку макроса. Теперь исправлено – phil