当我这样做的时候:
(do
(use 'oe.model.modelcore)
(alias 'model 'oe.model.modelcore)
(str ::model/record)
)
我收到错误:
java.lang.Exception: Invalid token: ::modelcore/a
java.lang.Exception: Unmatched delimiter: )
java.lang.Exception: Unmatched delimiter: )
但是,如果我在do块之外单独运行命令,它们可以工作:
(use 'oe.model.modelcore)
(alias 'model 'oe.model.modelcore)
(str ::model/record )
:返回:
:oe.model.modelcore/record
有谁知道为什么?
答案 0 :(得分:3)
此问题源于读取时间和运行时间的交互。
在第一个示例中,整个表单在执行之前被读取。 ::model/record
提供无效令牌异常,因为还没有名称空间为model
。
在第二个示例中,读取第一个表单,然后执行。与第二个相同,然后是第三个。在读入第三个表单时,有一个名称空间为model
的名称空间,因此不会抛出任何异常。
答案 1 :(得分:2)
这是由于一个棘手的边缘情况,称为Gilardi情景:http://technomancy.us/143
必须在require运行之前编译整个do。上面的链接向您展示了如何通过ns-resolve在运行时解析var来解决它。
另外:在ns表单之外调用裸使用和别名通常不是你想要的。