Долго думал, как реализовать возможность использовать в качестве выбранного объекта и переменную, которые хранятся в таблице заголовков, и значение со стека - наконец понял, что мне нужен отдельный класс выбранного объекта SelectedObject, который сам по себе абстрактен, а для работы непосредственно с объектом используется одна из его реализаций - либо SelectedRecord, либо SelectedValue.
Таким образом это позволило сделать реализацию класса стандартного потока вывода COut, переменную которого теперь можно стало копировать и использовать либо как значение для переменной-копии, либо просто как значение со стека.
Думал, что будет сложно, но всё оказалось довольно просто, зато сам код функций-методов заметно упростится.
По сути это была первая функция - регулярный метод класса, и я сразу же столкнулся с необходимостью абстрагировать код функции от того, как именно он вызывается. Там ещё будет над чем поработать, но то, что сделано, работает отлично.
Отлично в том смысле, что всё происходит как будто само собой. Нет каких-то специальных случаев использования, которые мне пришлось бы программировать дополнительно. Даже значение переменной копируется само - я лишь добавил функцию 'data_size' в класс COut.
Вот теперь наконец я могу переходить к работе над пользовательскими функциями, но возможно стоит добавить какую-нибудь арифметическую операцию (например - сложение) в классы интегральных типов, для того, чтобы убедиться, что работает например такая операция как
$ + $
То есть: выбранный объект - значение с вершины стека, к нему прибавляем значение с вершины стека, то есть само себя. И результат кладём на стек.
Как это будет работать, пока неочевидно. Может заработать само по себе, а может придётся придумывать реализацию.
Планирую добавить адресацию вида $0, $1, $2 и т.д., чтобы не заставлять пользователя городить огород из операций по перестановке данных на стеке. Просто $ будет синонимом $0.
Комментариев нет:
Отправить комментарий