Todos los tipos de almacenamiento implican almacenar algo en un punto y recuperarlo más tarde. Para hacer esto en una sola operación, debe almacenar o recuperar automáticamente, y especificar la posición del valor almacenado en la otra operación.
Es decir, para el almacenamiento explícito, puede crear un operador para recuperar el enésimo valor calculado antes de esta operación, o volver a colocar el valor actual después de n operaciones. Alternativamente, puede usar la posición absoluta desde el inicio del programa, o hacer más cosas como eliminar algunos elementos automáticamente después de algunas operaciones (como en una pila). También puede realizar múltiples operadores, recuperando de diferentes copias del almacenamiento con o sin estas operaciones automáticas. Y debe tratar de hacer que el número máximo necesario para especificar en las operaciones sea razonablemente pequeño, de modo que pueda asignar un operador para cada número.
Pero en la mayoría de los casos, ni siquiera necesita un operador y el lenguaje lo hará implícitamente. Es entonces cuando necesita considerar un modelo más estandarizado como pilas o colas. El más exitoso por ahora parecía ser la programación tácita, que ni siquiera menciona el almacenamiento directamente.
Si desea diseñar un nuevo modelo de este tipo, puede intentar expandir las evaluaciones como un dag, y tratar de pensar en un dag predeterminado si no se especifica nada más. Lo más probable es que el valor predeterminado sea solo un árbol, excepto que varias hojas pueden estar vinculadas a la misma entrada. Por ejemplo, podría usar una cola para un árbol equilibrado, o una pila para un árbol profundo donde las hojas son en su mayoría constantes, o algo así como Jelly para un árbol profundo donde las hojas son en su mayoría copias de la entrada.
Pero tenga en cuenta que puede codificar la forma de un árbol binario en solo 2 bits por operador. Por lo tanto, si su idioma tiene menos de 64 operadores, puede ignorar los modelos tradicionales y simplemente codificar el árbol completo en los bits de repuesto (llámelos banderas combine_parent y below_leaf). Incluso si hay más operadores, podría hacer un valor predeterminado bastante bueno (como el modelo de Jelly) y 3 modificadores para cambiarlo.
Puede usar el mismo modelo para almacenamiento implícito y explícito por conveniencia, pero no tiene que hacerlo. Por ejemplo, podría usar una pila para el almacenamiento implícito, pero no muestre elementos en el almacenamiento explícito (o en otro almacenamiento explícito además del implícito). Es probable que no se llame pila en la documentación final, pero se entiende la idea.
Como referencia, el tamaño de la codificación perfecta de un árbol binario es el logaritmo de los números catalanes . Y el tamaño de la codificación perfecta de un dag "binario" es el logaritmo de A082161 , pero obviamente no es práctico. Esto supone que un operador con argumento diferente ordena dos operadores diferentes, agregando otro bit cuando no lo está.
A veces es posible que aún desee variables para los bucles. Es posible reescribir los bucles de otras maneras. Pero si realmente lo necesita, no use una construcción de 1 byte además de un nombre para definir la variable. a menos que solo esté utilizando los valores preinicializados, generalmente es más eficiente usar un indicador de 1 bit para especificar si está leyendo o escribiendo esta variable.