Poszukuję sposobu na zapamiętanie wyników funkcji OCaml f
, która pobiera dwa parametry (lub więcej, ogólnie). Ponadto (i to jest trudna część), chcę, aby mapa leżąca u podstaw tego procesu całkowicie zapomniała o wyniku, jeśli jedna z wartości dwóch parametrów jest zbierana.Wynik słabej zapamiętywania funkcji wieloparametrowej w OCaml
Dla funkcji, która przyjmuje dokładnie jeden argument, można to zrobić za pomocą modułu Weak
i jego funktora Make
w prosty sposób. Aby uogólnić to na coś, co może zapamiętać funkcje o wyższej sile, naiwnym rozwiązaniem jest utworzenie słabej mapy z krotek wartości do wartości wynikowych. Ale to nie zadziała poprawnie w odniesieniu do zbierania śmieci, ponieważ krotka wartość istnieje tylko w zakresie funkcji zapamiętywania, a nie kod klienta, który wywołuje f
. W rzeczywistości słabym odniesieniem będzie krotka, która będzie zbiorem śmieci zaraz po zapamiętywaniu (w najgorszym przypadku).
Czy istnieje sposób, aby to zrobić bez ponownego wdrażania Weak.Make
?
Hash-consing jest ortogonalny do moich wymagań i tak naprawdę nie jest tak naprawdę pożądany dla moich wartości.
Dzięki!
Widzę, jak wyrzucanie śmieci z pierwszej wartości parametru spowodowałoby zwolnienie odpowiedniej tabeli dla drugiego parametru.Jednak GCing wartości w tabeli dla drugiego parametru nie robi nic dla swojej jednostki nadrzędnej (jeśli używany jest moduł 'Weak'), nawet jeśli wynikowa mapa jest pusta. Oczywiście można to zrobić, aktywnie skanując zawartość mapy i usuwając pierwsze klucze parametrów odwzorowujące puste tabele. – Nikos
Tak, jak powiedziałem, tabela pomocnicza nie zostanie zebrana, dopóki pierwszy parametr nie zostanie zwolniony. Ale zapamiętana wartość zwrotu zostanie zebrana (wydaje mi się). –