在clojure中使用和别名不在do块中工作

时间:2011-01-03 20:07:15

标签: clojure

当我这样做的时候:

(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

有谁知道为什么?

2 个答案:

答案 0 :(得分:3)

此问题源于读取时间和运行时间的交互。

在第一个示例中,整个表单在执行之前被读取。 ::model/record提供无效令牌异常,因为还没有名称空间为model

在第二个示例中,读取第一个表单,然后执行。与第二个相同,然后是第三个。在读入第三个表单时,有一个名称空间为model的名称空间,因此不会抛出任何异常。

答案 1 :(得分:2)

这是由于一个棘手的边缘情况,称为Gilardi情景:http://technomancy.us/143

必须在require运行之前编译整个do。上面的链接向您展示了如何通过ns-resolve在运行时解析var来解决它。

另外:在ns表单之外调用裸使用和别名通常不是你想要的。