За сегодня сделал примерно следующее:
* поправил навигацию по Alt-F7 к сущностям, заканчивающимся на цифру
* решил проблему с попыткой повторной блокировки при взаимодействии трассировки и вывода в ЛогЯдра под Win32 (теперь падает с кодом ошибки)
* печать локальной переменной по имени в кадре стека (не совсем то, что нужно, но как костыль может пригодиться ввиду того, что пПиши не умеет печатать всё, что надо. Хотя для проекта pw надо просто сделать отдельные пр-ры печати)
* починил интерпретатор после этих изменений
* поправил чтение опций команд, содержащее допустимые в идентификаторах знаки препинания
* для проекта pw написал порядка 10-15 строк инфраструктурного кода, который не считается, к сожалению
Вроде много пунктов, но в целом продолжается какое-то беспомощное барахтание в болоте технического долго. Я много делал демо-проектов, когда какой-то полезный (необходимый) функционал работал только в 1-2 частных случаях, чтобы показать путь, куда надо идти. Но потом оказалось, что идти тоже нужно мне самому, и теперь всё это приходится постепенно допиливать, поскольку постоянно возникает ситуация, что не работает вообще ничего, за что ни возьмёшься. Надо, чтобы работало хоть что-нибудь :)
дневник Яос
Re: дневник Яос
Пришлось расширить реализацию типов-объединений, чтобы можно было нормально наследовать методы. Теперь добавлен явный метакласс для каждого члена типа-объединения, укль на который записывается в каждый экземпляр. В нём заводятся тела методов, а сама "родовая функция" заводится в базовом типе. Как-то так:
Код: Выделить всё
модуль ДляRepr;
(* ДляRepr.Дей ~ *)
тип База = запись
м*: метаБаза;
полеБазы* : массив 50 из симв8
проц Метод*(); нач м.ТелоМетода(сам) кон Метод;
кон;
перем МетаБаза : метаБаза;
тип метаБаза* = окласс
проц ТелоМетода*(конст Б {можноБазу}: База);
нач трассируй("метод базы") кон ТелоМетода кон метаБаза;
тип Член = запись { членТипаˉобъединения } (База)
м*: метаБаза;
й* : массив 50 из симв8 кон;
проц ЯвиЧлен():Член;
нач
результат.м := МетаЧлен;
результат.й := "это член";
возврат результат кон ЯвиЧлен;
тип метаЧлен* = окласс (метаБаза)
проц {перекрыта} ТелоМетода*(конст Б {можноБазу}: Член);
нач утв(Б.м суть метаЧлен);
трассируй(Б.й, "метод члена") кон ТелоМетода кон метаЧлен;
перем МетаЧлен : метаЧлен;
тип Член2 = запись { членТипаˉобъединения } (База)
м*: метаБаза;
щ* : массив 50 из симв8 кон;
проц ЯвиЧлен2():Член2;
нач
результат.м := МетаЧлен2; (* укль на метакласс надо занести в экземпляр *)
результат.щ := "это член 2";
возврат результат кон ЯвиЧлен2;
тип метаЧлен2* = окласс (метаБаза)
проц {перекрыта} ТелоМетода*(конст Б {можноБазу}: Член2); (* должно компилироваться *)
нач утв(Б.м суть метаЧлен2);
трассируй("метод члена 2") кон ТелоМетода кон метаЧлен2;
перем МетаЧлен2 : метаЧлен2;
проц Дей*();
перем б : База; ч : Член; ч2 : Член2;
нач
ч := ЯвиЧлен(); ч2 := ЯвиЧлен2();
б := ч;
ч.Метод(); (* печатает "метод члена" *)
б.Метод(); (* печатает "метод члена" *)
б := ч2;
б.Метод(); (* печатает "метод члена 2" *)
(* трассируй(ч.полеБазы); *)
кон Дей;
нач
нов(МетаБаза); (* инициализация метаклассов *)
нов(МетаЧлен);
нов(МетаЧлен2);
кон ДляRepr.
Re: дневник Яос
Точнее сказать, компилятор ничего не знает про метакласс. Добавлено наследование методов
от базового типа к членам типа-объединения, а также атрибут "можноБазу" для параметров, который позволяет принимать параметр базового типа и неявно преобразовывать его к типу члена. Это позволяет не делать каждый раз явное преобразование при реализации тел методов для членов типа.
Короче, вы всё поняли, а если нет, то и я с трудом сам понимаю. Во всяком случае, теперь я могу нормально написать 70 реализаций метода __repr__ для моих типов данных и они будут вызываться без if-а на 70 веток и без 70 бессмысленных копирований данных из пустого в порожнее.
от базового типа к членам типа-объединения, а также атрибут "можноБазу" для параметров, который позволяет принимать параметр базового типа и неявно преобразовывать его к типу члена. Это позволяет не делать каждый раз явное преобразование при реализации тел методов для членов типа.
Короче, вы всё поняли, а если нет, то и я с трудом сам понимаю. Во всяком случае, теперь я могу нормально написать 70 реализаций метода __repr__ для моих типов данных и они будут вызываться без if-а на 70 веток и без 70 бессмысленных копирований данных из пустого в порожнее.