忽略本机互操作和瞬态,是否可以在 Clojure 中创建包含直接循环引用的任何数据结构?
看起来不可变的数据结构只能包含对自身先前版本的引用。是否有任何 Clojure API 可以创建引用自身的新数据结构?
Scheme 有 letrec 形式,它允许创建相互递归的结构——但是,据我所知,Clojure 没有任何类似的东西。
这个问题与将 Clojure 移植到 iOS 有关——它没有垃圾收集,但有引用计数。
忽略本机互操作和瞬态,是否可以在 Clojure 中创建包含直接循环引用的任何数据结构?
看起来不可变的数据结构只能包含对自身先前版本的引用。是否有任何 Clojure API 可以创建引用自身的新数据结构?
Scheme 有 letrec 形式,它允许创建相互递归的结构——但是,据我所知,Clojure 没有任何类似的东西。
这个问题与将 Clojure 移植到 iOS 有关——它没有垃圾收集,但有引用计数。
通过将某种形式的引用放入数据结构中,然后更新引用以指向整个结构,您可以非常轻松地创建循环引用。
一个简单的例子:
(def a [(atom nil)])
(reset! (first a) a)
这将创建一个包含一个元素的列表,该元素是一个指向列表的原子。
在 Clojure 中,大多数循环数据结构将明确地通过某种类型的 ref 类型(例如 atom)。
但是,您可以创建一个循环序列(这有点矛盾):
(let [a (atom nil)] (reset! a (lazy-seq (cons 1 @a))))
并且由于具有 deftype 的 Clojure 1.2,您可以创建其他可以引入循环性的数据类型,而无需显式(至少来自用户代码)任何类型的 ref 类型。