#blackboxcomponentbuilder #новыйкомпонентныйпаскаль
Оформился план действий, но сделать нужно ещё немало. Пока нет времени. План - тут. https://gitlab.com/budden/nkp/blob/mast ... ок-ня.html
(искать слово план)
делаем полиморфные функции
Re: делаем полиморфные функции
Цитирую:
Код: Выделить всё
сделать "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') и тем самым импортировать. Правда, нужно будет усовершенствовать сообщения об ошибках.
РазбериПостфиксныеДействияИдентификатора
Re: делаем полиморфные функции
Проект заморожен по экономическим причинам.
Re: делаем полиморфные функции
Хехе, а удалось всё же сделать кое-что. См. тут:
https://zx.oberon2.ru/forum/viewtopic.p ... 3245#p3245
Объявляется благодарность МихалНику и Ивану Денисову, без которых этот результат не был бы достигнут сейчас, а может быть, и вообще никогда не был бы достигнут, а также всем участникам оберон-сообщества, которые отвечали на вопросы.
https://zx.oberon2.ru/forum/viewtopic.p ... 3245#p3245
Объявляется благодарность МихалНику и Ивану Денисову, без которых этот результат не был бы достигнут сейчас, а может быть, и вообще никогда не был бы достигнут, а также всем участникам оберон-сообщества, которые отвечали на вопросы.
Re: делаем полиморфные функции
Сделать из Оберона (КП) лисп может и не получиться, но вот текущий план.
1. Добавить типов согласно картинке. В картинке -U означает отношение подтипа
(не путать с наследованием и старшинством целых типов). При этом любой элементарный тип в динамически типизированном мире оборачивается в свою запись.
Функции типа ДинBOOLEANValue дают защищённый способ из ANYPTR извлечь BOOLEAN, если
там содержится BOOLEAN, или получить ошибку, если там - не BOOLEAN. Также ничто не мешает принять параметр типа
ДинBOOLEANУкль, что создаёт иллюзию плавного перехода между стат. и дин. типизацией.
2. Уже реализован прототип новой встроенной функции ITEM, которая любое выражение элементарного типа обернёт
в Дин<ЭтотТип>Value и вернёт указатель на него, а указатели на записи возвращает без изменений.
Планируется упразднение этой функции и реализация более общего способа - параметра процедуры с атрибутом ДИН.
Это означает, что фактический параметр может иметь любой тип, кроме типов Untagged (неизвестнотиповых)
записей. При передаче этого параметра, если он - элементарного типа, то он оборачивается в Дин<ЭтотТип>Value,
и на принимающей стороне он уже выглядит как ANYPTR.
Такой параметр ДИН создаёт точку безопасную входа из статически типизированного мира в динамически типизированный.
Второй вариант - это атрибут ДИНХВОСТ. Такой параметр должен быть последним в сигнатуре. При вызове
в него отправляется произвольное число параметров любого типа, кроме неизвестнотиповых,
а принимающая сторона получает массив с типом элемента "укль на динамически типизированный объект",
по числу фактических параметров; элементарные типы опять же оборачиваются в Дин<ЭтотТип>Value.
3. Массивы пока не паханы. Как минимум, не реализован сам тип "укль на динамически типизированный объект".
С помощью рефлексии (уже и без нас) можно узнать всё про массив, но пока нет безопасного
способа обратиться к элементу любого массива. По идее можно расширять набор подтипов типа "укль на любой массив",
но пока недосуг - можно обойтись и опасным VAL. Кроме того, я пока не знаю, как хранятся в массивах расширяемые записи.
Поэтому неясно, какого набора типов будет достаточно и получится ли тут обойтись без параметрических типов.
1. Добавить типов согласно картинке. В картинке -U означает отношение подтипа
(не путать с наследованием и старшинством целых типов). При этом любой элементарный тип в динамически типизированном мире оборачивается в свою запись.
Функции типа ДинBOOLEANValue дают защищённый способ из ANYPTR извлечь BOOLEAN, если
там содержится BOOLEAN, или получить ошибку, если там - не BOOLEAN. Также ничто не мешает принять параметр типа
ДинBOOLEANУкль, что создаёт иллюзию плавного перехода между стат. и дин. типизацией.
2. Уже реализован прототип новой встроенной функции ITEM, которая любое выражение элементарного типа обернёт
в Дин<ЭтотТип>Value и вернёт указатель на него, а указатели на записи возвращает без изменений.
Планируется упразднение этой функции и реализация более общего способа - параметра процедуры с атрибутом ДИН.
Это означает, что фактический параметр может иметь любой тип, кроме типов Untagged (неизвестнотиповых)
записей. При передаче этого параметра, если он - элементарного типа, то он оборачивается в Дин<ЭтотТип>Value,
и на принимающей стороне он уже выглядит как ANYPTR.
Такой параметр ДИН создаёт точку безопасную входа из статически типизированного мира в динамически типизированный.
Второй вариант - это атрибут ДИНХВОСТ. Такой параметр должен быть последним в сигнатуре. При вызове
в него отправляется произвольное число параметров любого типа, кроме неизвестнотиповых,
а принимающая сторона получает массив с типом элемента "укль на динамически типизированный объект",
по числу фактических параметров; элементарные типы опять же оборачиваются в Дин<ЭтотТип>Value.
3. Массивы пока не паханы. Как минимум, не реализован сам тип "укль на динамически типизированный объект".
С помощью рефлексии (уже и без нас) можно узнать всё про массив, но пока нет безопасного
способа обратиться к элементу любого массива. По идее можно расширять набор подтипов типа "укль на любой массив",
но пока недосуг - можно обойтись и опасным VAL. Кроме того, я пока не знаю, как хранятся в массивах расширяемые записи.
Поэтому неясно, какого набора типов будет достаточно и получится ли тут обойтись без параметрических типов.