所有存储类型都涉及到将某物存储在一个点上,然后再取回它。若要仅在一个操作中执行此操作,则应自动存储或检索,并在另一操作中指定存储值的位置。
也就是说,对于显式存储,您可以创建一个运算符以在此操作之前检索第n个计算值,或在n次操作之后返回当前值。或者,您可以从程序开始使用绝对位置,或执行更多操作,例如在某些操作后自动删除某些元素(例如,在堆栈中)。您还可以创建多个运算符,无论是否具有这些自动操作,都可以从存储的不同副本中检索。而且,您应该尽量减少在操作中指定的最大数量,以便可以为每个数字分配一个运算符。
但是在大多数情况下,您甚至不需要运算符,并且语言会隐式地执行此操作。那就是当您需要考虑更标准化的模型(例如堆栈或队列)时。目前最成功的似乎是默认编程,它甚至没有直接提到存储。
如果要设计新的模型,则可以尝试将评估扩展为dag,如果未指定其他内容,则可以尝试考虑默认dag。最有可能的是,默认设置只是一棵树,除了可能将多个叶子链接到同一输入。例如,您可以将队列用于平衡树,或将堆栈用于叶子通常保持不变的深树,或将Jelly用作深度树,其中叶子主要是输入的副本。
但是请注意,每个运算符只可以对2位树的形状进行编码。因此,如果您的语言的运算符少于64个,则实际上您可能会忽略传统模型,而只是用备用位(将它们称为Combine_parent和below_leaf标志)对完整的树进行编码。即使有更多运算符,您也可以设置一个相当不错的默认值(例如Jelly模型)并使用3个修饰符对其进行更改。
为了方便起见,您可以将相同的模型用于隐式和显式存储,但不必这样做。例如,您可以将堆栈用于隐式存储,但不要在显式存储(或除隐式存储之外的其他显式存储)中弹出元素。在最终文档中可能不会将其称为堆栈,但是您可以理解。
作为参考,二叉树的完美编码大小是加泰罗尼亚数的对数。“二进制” dag的完美编码的大小是A082161的对数,但显然不切实际。假设一个具有不同自变量顺序的运算符将两个不同的运算符排序,否则将另外一位加。
有时您可能仍需要循环变量。可能可以用其他方式重写循环。但是,如果您确实需要它,除了定义变量的名称外,不要使用1字节的结构。除非您仅使用预初始化的值,否则通常使用1位标志来指定您正在读取还是写入此变量更为有效。