Можно ли создавать циклические ссылки в Clojure? - PullRequest
22 голосов
/ 12 сентября 2010

Игнорируя собственные взаимодействия и переходные процессы, возможно ли создать какие-либо структуры данных в Clojure, которые содержат прямые циклические ссылки?

Может показаться, что неизменные структуры данных могут когда-либо содержать только ссылки на предыдущие версии самих себя.Существуют ли какие-либо API Clojure, которые могли бы создать новую структуру данных, которая имеет ссылку на себя?

Схема имеет форму letrec, которая позволяет создавать взаимно рекурсивные структуры, но, насколько я могу судить, Clojure делаетНичего подобного не имеет.

Этот вопрос связан с портированием Clojure на iOS - в которой нет сборки мусора, но есть подсчет ссылок.

Ответы [ 2 ]

14 голосов
/ 12 сентября 2010

Вы можете очень легко создать круговую ссылку, поместив некоторую форму ссылки в структуру данных, а затем обновив ссылку, чтобы она указала на общую структуру.

Тривиальный пример:

(def a [(atom nil)])

(reset! (first a) a)

Это создаст список с одним элементом, который является атомом, указывающим на список.

8 голосов
/ 14 сентября 2010

В Clojure большинство круговых структур данных явно проходят через какой-либо тип ссылки (например, атом).

Однако вы можете создать круговую последовательность (это несколько оксюморон):

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

А начиная с Clojure 1.2 с deftype вы можете создавать другие типы данных, которые могут вводить цикличность, без явного использования (по крайней мере из кода пользователя) любого типа ссылки.

...