Estoy buscando una forma de memorizar los resultados de una función OCaml f
que toma dos parámetros (o más, en general). Además (y esta es la parte difícil), quiero que el mapa subyacente de este proceso olvide por completo un resultado si cualquiera de los valores de los dos parámetros es basura.Resultado débil de la función de multiparamétrico en OCaml
Para una función que toma exactamente un argumento, esto se puede hacer con el módulo Weak
y su funcionador Make
de una manera directa. Para generalizar esto a algo que pueda memorizar funciones de mayor aridad, una solución ingenua es crear un mapa débil a partir de tuplas de valores para generar valores. Pero esto no funcionará correctamente con respecto a la recolección de basura, ya que la tupla de valores solo existe dentro del alcance de la función de memorización, no del código de cliente que llama al f
. De hecho, la referencia débil será para la tupla, que será recogida de basura inmediatamente después de la memorización (en el peor de los casos).
¿Hay alguna manera de hacerlo sin volver a implementar Weak.Make
?
El hash-consing es ortogonal a mis requisitos y, de hecho, no es realmente deseable para mis valores.
Gracias!
Puedo ver cómo la recolección de basura del primer valor del parámetro daría como resultado la liberación de la tabla correspondiente para el segundo parámetro.Sin embargo, GCing un valor en una tabla para el segundo parámetro no hace nada para su padre (si se usa el módulo 'Débil'), incluso si el mapa resultante está vacío. Por supuesto, esto se puede hacer escaneando activamente el contenido del mapa y eliminando cualquier primera clave de parámetro que se asigne a tablas vacías. – Nikos
Derecha, como dije, la tabla secundaria no se recogerá hasta que se libere el primer parámetro. Pero el valor de retorno memorado se recolectaría (me parece). –