Todos os tipos de armazenamento envolvem armazenar algo em um ponto e recuperá-lo mais tarde. Para fazer isso em apenas uma operação, você deve armazenar ou recuperar automaticamente e especificar a posição do valor armazenado na outra operação.
Ou seja, para armazenamento explícito, você pode criar um operador para recuperar o enésimo valor calculado antes desta operação ou adiar o valor atual após n operações. Como alternativa, você pode usar a posição absoluta desde o início do programa ou fazer mais coisas, como remover alguns elementos automaticamente após algumas operações (como em uma pilha). Você também pode criar vários operadores, recuperando cópias diferentes do armazenamento com ou sem essas operações automáticas. E você deve tentar tornar o número máximo necessário para especificar nas operações razoavelmente pequeno, para poder atribuir um operador para cada número.
Mas na maioria dos casos, você nem precisa de um operador e o idioma fará isso implicitamente. É quando você precisa considerar um modelo mais padronizado, como pilhas ou filas. O mais bem-sucedido no momento parecia a programação tácita, que nem menciona diretamente o armazenamento.
Se você deseja projetar um novo modelo, tente expandir as avaliações como um dag e tente pensar em um dag padrão, se nada mais for especificado. Provavelmente, o padrão é apenas uma árvore, exceto que várias folhas podem estar vinculadas à mesma entrada. Você poderia, por exemplo, usar uma fila para uma árvore equilibrada, ou uma pilha para uma árvore profunda, onde as folhas são principalmente constantes, ou algo como Jelly para uma árvore profunda, onde as folhas são principalmente cópias da entrada.
Mas observe que você pode codificar a forma de uma árvore binária em apenas 2 bits por operador. Portanto, se seu idioma tiver menos de 64 operadores, você poderá realmente ignorar os modelos tradicionais e apenas codificar a árvore completa nos bits sobressalentes (chame-os de sinalizadores combine_parent e below_leaf). Mesmo se houver mais operadores, você pode fazer um padrão bastante bom (como o modelo do Jelly) e 3 modificadores para alterá-lo.
Você pode usar o mesmo modelo para armazenamento implícito e explícito por conveniência, mas não precisa. Por exemplo, você pode usar uma pilha para armazenamento implícito, mas não pop elementos no armazenamento explícito (ou em outro armazenamento explícito, além do implícito). É provável que não seja chamado de pilha na documentação final, mas você entendeu.
Para referência, o tamanho da codificação perfeita de uma árvore binária é o logaritmo dos números catalães . E o tamanho da codificação perfeita de um dag "binário" é o logaritmo de A082161 , mas obviamente impraticável. Isso pressupõe que um operador com argumento diferente ordene dois operadores diferentes, adicionando outro bit quando não estiver.
Às vezes, você ainda pode querer variáveis para os loops. Pode ser possível reescrever os loops de outras maneiras. Mas se você realmente precisar, não use uma construção de 1 byte, além de um nome para definir a variável. a menos que você esteja usando apenas os valores pré-inicializados, geralmente é mais eficiente usar um sinalizador de 1 bit para especificar se você está lendo ou gravando essa variável.