h1. 原因
当自动解析关键字字面量的命名空间部分引用未声明的别名时,读取器会产生错误,如下所示:
user> ::foo/bar
RuntimeException 无效令牌:::foo/bar clojure.lang.Util.runtimeException (Util.java:221)
然而,对于符号,没有这样的语法。这是函数(如{{clojure.spec.test.alpha/instrument}})的常见错误来源,这些函数接受具有变量名称的合格符号作为参数。目前,这种符号字面量的首选符号是语法引用,它当然接受任何命名空间。现在,如果某人不小心在那些符号参数中引用了在当前命名空间中未声明的别名(例如,将一些代码从一个命名空间移植到另一个命名空间),那么拥有与自动解析关键字相同的错误行为将会非常有用。以{{instrument}}为例,最终可能会调用潜在昂贵的真实函数而不是模拟,这很容易被忽视。
h1. 建议的语法
这有点棘手。首先想到的是双反引号,如在{{``foo/bar}}中,但这已经具有含义,并且可能会在现有的宏中被使用。我想{{%foo/bar}}可能可以工作,尽管当然不能保证这个名称 hasn't already been used in actual namespace names, too.
h1. 状态
正如你所见,我还没有对可能的语法选项进行详细的调查,也没有开始着手修复。我只是想征求对这个问题的意见,看看是否值得进一步追究。