22

ネイティブの相互運用性とトランジェントを無視して、Clojure で直接循環参照を含むデータ構造を作成することは可能ですか?

不変のデータ構造には、それ自体の以前のバージョンへの参照のみを含めることができるようです。それ自体への参照を持つ新しいデータ構造を作成できる Clojure API はありますか?

Scheme には、相互に再帰的な構造を作成できる letrec 形式がありますが、私が知る限り、Clojure には同様のものはありません。

この質問は、Clojure を iOS に移植することに関連しています。iOS にはガベージ コレクションはありませんが、参照カウントはあります。

4

2 に答える 2

14

データ構造内に何らかの形式の参照を配置し、参照を更新して構造全体を指すようにすることで、循環参照を非常に簡単に作成できます。

些細な例:

(def a [(atom nil)])

(reset! (first a) a)

これにより、リストを指すアトムである 1 つの要素を持つリストが作成されます。

于 2010-09-12T19:50:22.010 に答える
8

Clojure では、ほとんどの循環データ構造は明示的にある種の ref 型 (atom など) を通過します。

ただし、循環シーケンスを作成できます (やや矛盾しています)。

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

また、Clojure 1.2 で deftype を使用すると、明示的に (少なくともユーザーコードから) 任意の種類の ref 型を使用せずに、循環性を導入できる他のデータ型を作成できます。

于 2010-09-14T10:02:30.860 に答える