评论者:khinsen
经过一番思考,我认为正确的解决方案是将符号宏像普通符号一样进行评估。这意味着全局定义(defsymbolmacro)使用命名空间符号,而局部符号定义(symbol-macrolet)只接受普通符号,并为限定符号抛出异常,就像 let 一样。
有了这些规则,tools.macro 在正确代码中对命名空间的处理是正确的,但它未进行必要的错误处理,因为它允许使用限定符号的 symbol-macrolet。
请注意,根据这些规则,您的示例代码是不正确的。您必须编写
(symbol-macrolet [~'type$ ...] ...)
和
(defmacro caster [x] `(~'type$ ~x))
尽管您可能更喜欢将后者写成
(defmacro caster [x] (list 'type$ x))
但这是一个口味问题。