为什么MVCC中没有clojure命名空间?

时间:2013-10-04 14:18:01

标签: clojure

关于如何最好地招标名称空间的讨论很多。斯图尔特·塞拉在他的Lifecycle Composition以及与clojure.tools.namespace的合作中为我们所有人提供了启示。

大多数复杂性来自名称空间的可变性;那么为什么我们不把命名空间放在Clojures自己的MVCC中呢?必须有理由说明原因,但我自己无法弄明白。

2 个答案:

答案 0 :(得分:2)

一个实际的原因是命名空间用于构建MVCC ,因此它使构建编译器更难,但并非不可能,使用MVCC来构建命名空间。另一个原因在于程序员修改它们的方式,虽然refs的内容通常通过在程序运行时操纵数据来修改,但是在程序开发期间,namsepace中的vars的内容几乎总是被修改,其中绝大多数时间是程序员希望能够在系统范围内立即看到变更。

值得注意的是,在需要多个功能的协调更新的情况下,存在用于存储功能的命名空间的替代方案。如果你需要进行attomic升级,将你的函数存储在ref中并使用dosync升级程序是合理的。这样你就可以为需要它们的函数提供MVCC语义并保持更新 - 将命名空间的语义放在任何不需要协调升级的地方。

答案 1 :(得分:1)

代码加载本质上是一个可以完全任意的操作 - 加载命名空间可以触发所有类型的副作用,因此不适合放入事务中。

无论如何,我认为可以对当前的加载机制进行一些改进:例如,在对nsrequire等的调用中,可以列出所有当前变量,以及所有变量因呼叫而被添加的变量;如果对ns / require的调用失败,则后一个列表中的所有变量都将被删除。

请注意,这种方法需要序列化对ns / require的调用,而不是当前的并发机制。我认为并不存在并发加载的强有力的理由。

相关问题