为什么clojure命名空间不在MVCC中?

为什么clojure命名空间不在MVCC中?,clojure,Clojure,关于如何最好地提供名称空间,有很多讨论。斯图尔特·塞拉(Stuart Sierra)在他的作品和他的合作中向我们提供了这方面的启示 大多数复杂性来自名称空间的易变性;那么我们为什么不把名称空间放在Clojures自己的MVCC中呢?一定有原因,但我自己无法解释。一个实际原因是名称空间用于构建MVCC,因此在构建名称空间时使用MVCC会使构建编译器变得更加困难,尽管并非不可能。另一个原因在于程序员修改它们的方式,而REF的内容通常是通过在程序运行时操纵数据来修改的,namsepace中变量的内容几

关于如何最好地提供名称空间,有很多讨论。斯图尔特·塞拉(Stuart Sierra)在他的作品和他的合作中向我们提供了这方面的启示


大多数复杂性来自名称空间的易变性;那么我们为什么不把名称空间放在Clojures自己的MVCC中呢?一定有原因,但我自己无法解释。

一个实际原因是名称空间用于构建MVCC,因此在构建名称空间时使用MVCC会使构建编译器变得更加困难,尽管并非不可能。另一个原因在于程序员修改它们的方式,而REF的内容通常是通过在程序运行时操纵数据来修改的,namsepace中变量的内容几乎总是在程序开发过程中被修改的,在程序开发过程中,程序员大部分时间都希望在系统范围内立即看到更改


值得注意的是,在需要对多个函数进行协调更新的情况下,可以使用名称空间来存储函数。如果需要阿图升级,将函数存储在ref中并使用dosync升级程序是合理的。通过这种方式,您可以为需要它们的函数提供MVCC语义,并在不需要协调升级的任何地方保留名称空间的更新语义。

代码加载本质上是一种完全任意的操作-加载名称空间可能会触发各种副作用,因此,它不适合用于交易

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


请注意,这种方法需要序列化对
ns
/
require
的调用,而不是当前的并发机制。无论如何,我不认为并发加载有充分的理由。

这是一个好主意-有时我希望有Erlang可更新的运行进程-但远非总是如此。关于将FN放入参考中-听起来非常有趣!可以构建自定义命名空间系统。。。我只是想知道Clojure会在多大程度上干扰它,一点也不会。调用函数时会有轻微的查找开销,这与调用包含函数的变量(#'+1 2 3)与(+1 2 3)调用函数非常相似。两种方法都有效,第一种方法速度较慢,但它可以让您更广泛地重新定义+。在本例中,您将调用类似(@+1 2 3)的函数。