делаем полиморфные функции

Работы по ББЦБ (BlackBoxComponentBuilder) навсегда прекращены, т.к. A2OS - более интересный для наших задач вариант Оберон-подобной среды. В этом форуме хранятся темы про ББЦБ - пригодятся.
Закрыто
БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

делаем полиморфные функции

Сообщение БудДен » 06.11.18 22:54

#blackboxcomponentbuilder #новыйкомпонентныйпаскаль

Оформился план действий, но сделать нужно ещё немало. Пока нет времени. План - тут. https://gitlab.com/budden/nkp/blob/mast ... ок-ня.html
(искать слово план)

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: делаем полиморфные функции

Сообщение БудДен » 07.11.18 18:57

Цитирую:

Код: Выделить всё

сделать "case" по примитивному типу, известному во время компиляции. Как-то так (смотреть на longfn, entierfn и т.п.)

if ч.тип == 'INTEGER' then 
Обернуть ч в узел вызова функции NewItemFromInteger
elseif ч.тип = 'STRING' then
Обернуть ч в узел вызова функции NewItemFromString
...
endif 
Как вставить вызов? Идём по процессу, как это делает компилятор.

РазбериМножитель
 РазбериИдентификторВтчСКвалификатором
      НяД.PrepCall(x, fpar);
      IF (x.obj # NIL) & (x.obj.mode = TProc) THEN НяД.CheckBuffering(x.left, NIL, x.obj.link, pre, lastp)
      END;
      РазбериФактическиеПараметры(apar, fpar, pre, lastp);
      НяД.Call(x, apar, fpar);
      IF pre # NIL THEN НяД.Construct(Ncomp, pre, x); 
И т.п. При этом, если идти по этим ф-ям, то видно, что можно задать модуль и пр-ру именами (например, 'Kernel' 'NewItemFromInt') и тем самым импортировать. Правда, нужно будет усовершенствовать сообщения об ошибках.

РазбериПостфиксныеДействияИдентификатора

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: делаем полиморфные функции

Сообщение БудДен » 15.11.18 21:05

Проект заморожен по экономическим причинам.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: делаем полиморфные функции

Сообщение БудДен » 04.12.18 01:00

Хехе, а удалось всё же сделать кое-что. См. тут:

https://zx.oberon2.ru/forum/viewtopic.p ... 3245#p3245

Объявляется благодарность МихалНику и Ивану Денисову, без которых этот результат не был бы достигнут сейчас, а может быть, и вообще никогда не был бы достигнут, а также всем участникам оберон-сообщества, которые отвечали на вопросы.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: делаем полиморфные функции

Сообщение БудДен » 01.01.19 17:10

Сделать из Оберона (КП) лисп может и не получиться, но вот текущий план.
1. Добавить типов согласно картинке. В картинке -U означает отношение подтипа
(не путать с наследованием и старшинством целых типов).
ПланПолиморфизма2.png
ПланПолиморфизма2.png (47.58 КБ) 2930 просмотров
При этом любой элементарный тип в динамически типизированном мире оборачивается в свою запись.
Функции типа ДинBOOLEANValue дают защищённый способ из ANYPTR извлечь BOOLEAN, если
там содержится BOOLEAN, или получить ошибку, если там - не BOOLEAN. Также ничто не мешает принять параметр типа
ДинBOOLEANУкль, что создаёт иллюзию плавного перехода между стат. и дин. типизацией.

2. Уже реализован прототип новой встроенной функции ITEM, которая любое выражение элементарного типа обернёт
в Дин<ЭтотТип>Value и вернёт указатель на него, а указатели на записи возвращает без изменений.
Планируется упразднение этой функции и реализация более общего способа - параметра процедуры с атрибутом ДИН.
Это означает, что фактический параметр может иметь любой тип, кроме типов Untagged (неизвестнотиповых)
записей. При передаче этого параметра, если он - элементарного типа, то он оборачивается в Дин<ЭтотТип>Value,
и на принимающей стороне он уже выглядит как ANYPTR.

Такой параметр ДИН создаёт точку безопасную входа из статически типизированного мира в динамически типизированный.

Второй вариант - это атрибут ДИНХВОСТ. Такой параметр должен быть последним в сигнатуре. При вызове
в него отправляется произвольное число параметров любого типа, кроме неизвестнотиповых,
а принимающая сторона получает массив с типом элемента "укль на динамически типизированный объект",
по числу фактических параметров; элементарные типы опять же оборачиваются в Дин<ЭтотТип>Value.

3. Массивы пока не паханы. Как минимум, не реализован сам тип "укль на динамически типизированный объект".
С помощью рефлексии (уже и без нас) можно узнать всё про массив, но пока нет безопасного
способа обратиться к элементу любого массива. По идее можно расширять набор подтипов типа "укль на любой массив",
но пока недосуг - можно обойтись и опасным VAL. Кроме того, я пока не знаю, как хранятся в массивах расширяемые записи.
Поэтому неясно, какого набора типов будет достаточно и получится ли тут обойтись без параметрических типов.

Закрыто