Похоже, что с этой версией всё. Я окончательно запутался в собственном коде.
Добавил копирование данных для $* и $$*, и данные стали копироваться при обращении через $x. Я попытался разобраться, что происходит, но абсолютно не понимаю, в каком месте происходит копирование.
Простейшая команда
$* append true // Создаём массив типа ValueArray
$2 0 append true // В этом массиве мы хотим добавить в первый массив значение true
Вместо того, чтобы взять значение по ссылке, где-то этот первый массив копируется, и уже в копию добавляется true.
Это ещё полбеды. Я попробовал брать не массив, а создавать ссылку на него. Всё равно берётся копия, и в копию добавляется значение.
В какой-то момент я просто понял, что топчусь на месте, заблудившись в трёх соснах. С данными нужно работать не так.
Всё, что вводит пользователь, нужно помещать в таблицу значений, как в базу данных. А в операциях использовать индексы в этой базе. Тогда если нужно что-то куда-то скопировать, то данные будут взяты из таблицы и скопированы в таблицу. А не так, что мы создаём какой-то объект в памяти, затем его копируем, затем удаляем, ссылаемся на него по ссылке и т.п.
Нужна чёткость. Вот значение, вот его тип, вот его копия.
Ещё на прошлой неделе я понял, что новой версии не избежать, и только какой-то позитивный прогресс меня немного остановил. Просто я не видел смысла всё переписывать без чёткой концепции, зачем я это делаю.
Что ж, это вдохновляет. Работая над этой программой, я обратил внимание, что мне даже нравится её переписывать с нуля, когда приходится это делать.
Окончательно меня добила перспектива того, что $0 1 как объект - это не то же самое, что $0 1 как параметр.
Господи, - сказал я самому себе. - Мне нужно просто взять значение из одного массива и добавить его в другой массив. Почему у меня при этом копируются какие-то данные ещё - создаются указатели и т.п.?
По сути ведь требуется просто вычислить адрес, задаваемый пользователем.
Адрес объекта Адрес функции Адрес параметра
Всё это должны быть индексы. И у меня это индексы, но лишь отчасти. Почему-то сами данные я не храню в таблице, а куда-то копирую между какими-то переменными.
Но насколько же всё это непохоже на то, чему меня учили. Я уже третий год по сути учусь программировать с нуля. Не так, как делал до этого. Иногда меня просто пугает то, что я как программист не в состоянии написать программу, которую возможно лет 30 назад написал бы за неделю.
Но 30 лет назад все программы были такими простыми. Думаю, что и эта программа в итоге получится довольно простой. А она каждый раз невероятно усложняется.
Нечто подобное я писал на PHP, и поначалу тоже использовал указатели, но потом не смог разобраться в тех ошибках, которые из-за этого возникали. Переписал с нуля на индексах, и всё заработало.
Но это заняло у меня тогда 4 месяца. Какие-то операции я смог в ней начать выполнять. Сейчас у меня уже в первую неделю работают calc_hash и exec, и это фантастика, по сравнению с тем, что было на PHP. Так что в принципе я полон оптимизма.
Комментариев нет:
Отправить комментарий