Tous les types de stockage impliquent de stocker quelque chose à un moment donné et de le récupérer plus tard. Pour ce faire en une seule opération, vous devez soit stocker ou récupérer automatiquement, et spécifier la position de la valeur stockée dans l'autre opération.
Autrement dit, pour un stockage explicite, vous pouvez créer un opérateur pour récupérer la nième valeur calculée avant cette opération, ou remettre la valeur actuelle après n opérations. Alternativement, vous pouvez utiliser la position absolue depuis le début du programme, ou faire plus de choses comme supprimer automatiquement certains éléments après certaines opérations (comme dans une pile). Vous pouvez également créer plusieurs opérateurs, en récupérant à partir de différentes copies du stockage avec ou sans ces opérations automatiques. Et vous devriez essayer de faire le nombre maximum nécessaire pour spécifier dans les opérations raisonnablement petit, afin que vous puissiez affecter un opérateur pour chaque numéro.
Mais dans la plupart des cas, vous n'avez même pas besoin d'un opérateur et le langage le fera implicitement. C'est à ce moment que vous devez envisager un modèle plus standardisé tel que des piles ou des files d'attente. La plus réussie semble être la programmation tacite, qui ne mentionne même pas directement le stockage.
Si vous souhaitez concevoir un nouveau modèle de ce type, vous pouvez essayer d'étendre les évaluations en tant que dag et essayer de penser à un dag par défaut si rien d'autre n'est spécifié. Très probablement, la valeur par défaut est juste un arbre, sauf que plusieurs feuilles peuvent être liées à la même entrée. Vous pouvez par exemple utiliser une file d'attente pour un arbre équilibré, ou une pile pour un arbre profond où les feuilles sont généralement constantes, ou quelque chose comme Jelly pour un arbre profond où les feuilles sont principalement des copies de l'entrée.
Mais notez que vous pouvez encoder la forme d'un arbre binaire en seulement 2 bits par opérateur. Donc, si votre langue a moins de 64 opérateurs, vous pouvez en fait ignorer les modèles traditionnels et simplement encoder l'arborescence complète dans les bits de rechange (appelez-les flags combine_parent et below_leaf). Même s'il y a plus d'opérateurs, vous pouvez faire un assez bon défaut (comme le modèle de Jelly) et 3 modificateurs pour le changer.
Vous pouvez utiliser le même modèle pour le stockage implicite et explicite pour plus de commodité, mais ce n'est pas obligatoire. Par exemple, vous pouvez utiliser une pile pour le stockage implicite, mais ne pas insérer d'éléments dans le stockage explicite (ou dans un autre stockage explicite en plus de celui implicite). Il est probable que cela ne s'appellera pas une pile dans la documentation finale, mais vous avez l'idée.
Pour référence, la taille du codage parfait d'un arbre binaire est le logarithme des nombres catalans . Et la taille de l'encodage parfait d'un dag "binaire" est le logarithme de A082161 , mais évidemment peu pratique. Cela suppose qu'un opérateur avec un ordre d'argument différent deux opérateurs différents, ajoutant un autre bit quand il ne l'est pas.
Parfois, vous pouvez toujours vouloir des variables pour les boucles. Il peut être possible de réécrire les boucles de différentes manières. Mais si vous en avez vraiment besoin, n'utilisez pas une construction à 1 octet en plus d'un nom pour définir la variable. à moins que vous n'utilisiez que les valeurs préinitialisées, il est généralement plus efficace d'utiliser un indicateur 1 bit pour spécifier si vous lisez ou écrivez cette variable.