Все типы хранилищ подразумевают хранение чего-либо в одной точке и последующее извлечение. Чтобы сделать это только в одной операции, вы должны либо автоматически сохранять, либо извлекать данные, а также указывать позицию сохраненного значения в другой операции.
То есть для явного хранения вы можете создать оператор для получения n-го вычисленного значения перед этой операцией или вернуть текущее значение после n операций. В качестве альтернативы, вы можете использовать абсолютную позицию с самого начала программы или делать больше вещей, таких как автоматическое удаление некоторых элементов после некоторых операций (например, в стеке). Вы также можете сделать несколько операторов, извлекая из разных копий хранилища с или без этих автоматических операций. И вы должны попытаться сделать максимальное количество, необходимое для указания операций, достаточно маленьким, чтобы вы могли назначить по одному оператору для каждого номера.
Но в большинстве случаев вам даже не нужен оператор, и язык сделает это неявно. Именно тогда вам нужно рассмотреть более стандартизированную модель, такую как стеки или очереди. Самым успешным на данный момент кажется молчаливое программирование, в котором даже не упоминается хранилище напрямую.
Если вы хотите разработать новую такую модель, вы можете попытаться расширить оценки как dag и попытаться придумать dag по умолчанию, если больше ничего не указано. Скорее всего, по умолчанию это просто дерево, за исключением того, что несколько листов могут быть связаны с одним и тем же входом. Например, вы можете использовать очередь для сбалансированного дерева, или стек для глубокого дерева, где листья в основном постоянны, или что-то вроде Jelly для глубокого дерева, где листья в основном являются копиями входных данных.
Но учтите, что вы можете закодировать форму двоичного дерева всего в 2 бита на оператор. Таким образом, если в вашем языке менее 64 операторов, вы можете фактически игнорировать традиционные модели и просто кодировать полное дерево в резервных битах (называть их флагами comb_parent и under_leaf). Даже если есть больше операторов, вы можете сделать довольно хорошее значение по умолчанию (например, модель Jelly) и 3 модификатора, чтобы изменить его.
Вы можете использовать ту же модель для неявного и явного хранения для удобства, но это не обязательно. Например, вы могли бы использовать стек для неявного хранения, но не вставлять элементы в явное хранилище (или в другое явное хранилище в дополнение к неявному). Вероятно, это не будет называться стеком в окончательной документации, но вы поняли идею.
Для справки, размер идеальной кодировки двоичного дерева - это логарифм каталонских чисел . А размер идеальной кодировки «двоичного» знака является логарифмом A082161 , но, очевидно, нецелесообразен. Предполагается, что оператор с другим порядком аргументов два разных оператора, добавляя еще один бит, когда это не так.
Иногда вам могут понадобиться переменные для циклов. Может быть возможно переписать циклы другими способами. Но если вам это действительно нужно, не используйте 1-байтовую конструкцию в дополнение к имени для определения переменной. если только вы не используете только предварительно инициализированные значения, обычно более эффективно использовать 1-битный флаг, чтобы указать, читаете ли вы или записываете эту переменную.