我正在尝试编写一个宏,它将在Clojure中捕获编译时错误.具体来说,我想捕获当调用并clojure.lang.Compiler$CompilerException抛出一个尚未针对该数据类型实现的协议方法时抛出的异常.
到目前为止,我有:
(defmacro catch-compiler-error
[body]
(try
(eval body)
(catch Exception e e)))
但当然,我被告知这eval是邪恶的,你通常不需要使用它.有没有办法实现这个而不使用eval?
我倾向于认为这eval是合适的,因为我特别希望在运行时而不是在编译时评估代码.
我正在 Clojure 中编写 Trie 数据结构的实现,并认为最好使用 defrecord 来创建我自己的类型,该类型可以重载操作集合的函数。如何确定要扩展的协议名称,以便为我的新 Trie 类型实现 conj 和其他类似功能?