среда, 17 февраля 2021 г.

Снова переписывать

 Похоже, что с этой версией всё. Я окончательно запутался в собственном коде.

Добавил копирование данных для $* и $$*, и данные стали копироваться при обращении через $x. Я попытался разобраться, что происходит, но абсолютно не понимаю, в каком месте происходит копирование.

Простейшая команда

$* append true   // Создаём массив типа ValueArray
$2 0 append true // В этом массиве мы хотим добавить в первый массив значение true

Вместо того, чтобы взять значение по ссылке, где-то этот первый массив копируется, и уже в копию добавляется true.

Это ещё полбеды. Я попробовал брать не массив, а создавать ссылку на него. Всё равно берётся копия, и в копию добавляется значение.

В какой-то момент я просто понял, что топчусь на месте, заблудившись в трёх соснах. С данными нужно работать не так.

Всё, что вводит пользователь, нужно помещать в таблицу значений, как в базу данных. А в операциях использовать индексы в этой базе. Тогда если нужно что-то куда-то скопировать, то данные будут взяты из таблицы и скопированы в таблицу. А не так, что мы создаём какой-то объект в памяти, затем его копируем, затем удаляем, ссылаемся на него по ссылке и т.п.

Нужна чёткость. Вот значение, вот его тип, вот его копия.

Ещё на прошлой неделе я понял, что новой версии не избежать, и только какой-то позитивный прогресс меня немного остановил. Просто я не видел смысла всё переписывать без чёткой концепции, зачем я это делаю.

Что ж, это вдохновляет. Работая над этой программой, я обратил внимание, что мне даже нравится её переписывать с нуля, когда приходится это делать.

Окончательно меня добила перспектива того, что $0 1 как объект - это не то же самое, что $0 1 как параметр.

Господи, - сказал я самому себе. - Мне нужно просто взять значение из одного массива и добавить его в другой массив. Почему у меня при этом копируются какие-то данные ещё - создаются указатели и т.п.?

По сути ведь требуется просто вычислить адрес, задаваемый пользователем.

Адрес объекта Адрес функции Адрес параметра

Всё это должны быть индексы. И у меня это индексы, но лишь отчасти. Почему-то сами данные я не храню в таблице, а куда-то копирую между какими-то переменными.

Но насколько же всё это непохоже на то, чему меня учили. Я уже третий год по сути учусь программировать с нуля. Не так, как делал до этого. Иногда меня просто пугает то, что я как программист не в состоянии написать программу, которую возможно лет 30 назад написал бы за неделю.

Но 30 лет назад все программы были такими простыми. Думаю, что и эта программа в итоге получится довольно простой. А она каждый раз невероятно усложняется.

Нечто подобное я писал на PHP, и поначалу тоже использовал указатели, но потом не смог разобраться в тех ошибках, которые из-за этого возникали. Переписал с нуля на индексах, и всё заработало.

Но это заняло у меня тогда 4 месяца. Какие-то операции я смог в ней начать выполнять. Сейчас у меня уже в первую неделю работают calc_hash и exec, и это фантастика, по сравнению с тем, что было на PHP. Так что в принципе я полон оптимизма.

Комментариев нет: