22

忽略本机互操作和瞬态,是否可以在 Clojure 中创建包含直接循环引用的任何数据结构?

看起来不可变的数据结构只能包含对自身先前版本的引用。是否有任何 Clojure API 可以创建引用自身的新数据结构?

Scheme 有 letrec 形式,它允许创建相互递归的结构——但是,据我所知,Clojure 没有任何类似的东西。

这个问题与将 Clojure 移植到 iOS 有关——它没有垃圾收集,但有引用计数。

4

2 回答 2

14

通过将某种形式的引用放入数据结构中,然后更新引用以指向整个结构,您可以非常轻松地创建循环引用。

一个简单的例子:

(def a [(atom nil)])

(reset! (first a) a)

这将创建一个包含一个元素的列表,该元素是一个指向列表的原子。

于 2010-09-12T19:50:22.010 回答
8

在 Clojure 中,大多数循环数据结构将明确地通过某种类型的 ref 类型(例如 atom)。

但是,您可以创建一个循环序列(这有点矛盾):

(let [a (atom nil)] (reset! a (lazy-seq (cons 1 @a))))

并且由于具有 deftype 的 Clojure 1.2,您可以创建其他可以引入循环性的数据类型,而无需显式(至少来自用户代码)任何类型的 ref 类型。

于 2010-09-14T10:02:30.860 回答