如果这很重要,我正在使用苹果酒。
(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
我对表单进行了宏扩展以对其进行调试,然后得到了这个:
(do
(println "" '(if true 6 4) "...")
(let* [result (if true 6 4)] (println "" result "->" (if true 6 4)))
(if true 6 4))
这看起来一点也不差,所以我尝试评估扩展的形式。令人惊讶的是,它有效,评估为 6。
为什么会这样?
更重要的是,我做错了什么来获得异常?