mamJak "oznaczyć" węzeł w strukturze danych Clojure?
- strukturę danych Clojure, nazwijmy to
dom
, drzewa wektorów i mapy nieokreślony głębokości; - konkretny węzeł, nazwijmy go węzłem
focus
, określanym jako ścieżką do drzewa: sekwencją kluczy, które można przedstawićget-in
.
będę decydując się na skoncentrowanych węzła w jednej funkcji i chcę jakoś reprezentować że wybór skoncentrowanych węzła w sposób, który może zostać przekazany do innej funkcji w sposób, który nie narusza niezmienność i nie jest w konflikt z trwałymi strukturami danych Clojure.
Kiedy przemierzać drzewo, chcę traktować węzeł focus
inaczej: na przykład, gdybym był druk drzewo, może chcę wydrukować węzeł focus
w pogrubioną.
Gdybym używał języka C lub Java, mógłbym zapisać wskaźnik/odwołanie do węzła focus
, który mógłbym porównać z bieżącym węzłem podczas przechodzenia przez drzewo. Nie sądzę, że jest to właściwy sposób na zrobienie tego w Clojure: czuje się odrażająco i jestem pewien, że jest jakiś sposób, aby to zrobić, wykorzystując trwałe struktury danych Clojure.
Rozwiązanie musi działać w Clojure i ClojureScript.
Opcje mogę myśleć to:
- Store odniesienie i sprawdzić przeciwny.
- Dołącz znacznik do danego węzła.
Jednocześnie rekurencyjnie do drzewa i wzdłuż ścieżki do zaznaczonego węzła.
- Opcja (1) jest nieatrakcyjna, jak już wyjaśniłem.
- Opcja (2) wydaje się najlepsza i bezbolesna, biorąc pod uwagę trwałe struktury danych.
- Opcja (3) jest podobna do opcji (2), z tym wyjątkiem, że łączy etapy oznaczania i przechodzenia .
Jestem pewien, że jest to wspólny problem. Czy istnieje standardowe rozwiązanie tego problemu?
Myślę, że możesz użyć metadanych do implementacji 2, ale nie znam ogólnego rozwiązania. –
Dziękuję. Mógłbym używać metadanych, ale prawdopodobnie nie. Pytanie jest nieco szersze niż wdrożenie. – Joe
Nigdy nie boli, aby to ponownie przeczytać, ale nie sądzę, że zadaję pytanie oparte głównie na opiniach. Jest całkowicie możliwe (i nie mam możliwości poznania), że istnieje standardowy wzorzec idiomatyczny do robienia tego. Jeśli odpowiedź brzmi "nie", jest to poprawna odpowiedź. – Joe