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