Как можно создавать циклические (и неизменные) структуры данных в Clojure без дополнительной косвенности?

Мне нужно представить ориентированные графы в Clojure. Я хотел бы представить каждый узел в графе как объект (возможно, запись), который включает поле с именем : edge , которое представляет собой набор узлов, которые напрямую достижимы из текущего узла. Надеюсь, это само собой разумеется, но я бы хотел, чтобы эти графики были неизменными.

Я могу построить ориентированные ациклические графы с помощью этого подхода, если я выполняю топологическую сортировку и строю каждый граф «с листа вверх».

Этот подход не работает для циклических графов, Однако. Единственный обходной путь, который я могу придумать, - это создать отдельную коллекцию (возможно, карту или вектор) всех ребер для всего графа. Поле : edge в каждом узле будет иметь ключ (или индекс) в наборе ребер графа. Добавление этого дополнительного уровня косвенного обращения работает, потому что я могу создавать ключи (или индексы) до того, как вещи, которые они (будут) будут ссылаться, существуют, но это похоже на кладж. Мне не только нужно выполнять дополнительный поиск всякий раз, когда я хочу посетить соседний узел, но я также должен передавать глобальную коллекцию ребер, что кажется очень неуклюжим.

Я ' Вы слышали, что в некоторых Лиспах есть способ создания циклических списков, не прибегая к функциям мутации. Есть ли способ создать неизменяемые циклические структуры данных в Clojure?

17
задан Laurence Gonsalves 2 January 2011 в 22:30
поделиться