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