それが問題なら、私はCIDERを使用しています。
(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 でした。
なぜこれが起こるのですか?
さらに重要なことは、例外を取得するために何が間違っているのでしょうか?