Сделать из Оберона (КП) лисп может и не получиться, но вот текущий план.
1. Добавить типов согласно картинке. В картинке -U означает отношение подтипа
(не путать с наследованием и старшинством целых типов).
- ПланПолиморфизма2.png (47.58 КБ) 3117 просмотров
При этом любой элементарный тип в динамически типизированном мире оборачивается в свою запись.
Функции типа ДинBOOLEANValue дают защищённый способ из ANYPTR извлечь BOOLEAN, если
там содержится BOOLEAN, или получить ошибку, если там - не BOOLEAN. Также ничто не мешает принять параметр типа
ДинBOOLEANУкль, что создаёт иллюзию плавного перехода между стат. и дин. типизацией.
2. Уже реализован прототип новой встроенной функции ITEM, которая любое выражение элементарного типа обернёт
в Дин<ЭтотТип>Value и вернёт указатель на него, а указатели на записи возвращает без изменений.
Планируется упразднение этой функции и реализация более общего способа - параметра процедуры с атрибутом ДИН.
Это означает, что фактический параметр может иметь любой тип, кроме типов Untagged (неизвестнотиповых)
записей. При передаче этого параметра, если он - элементарного типа, то он оборачивается в Дин<ЭтотТип>Value,
и на принимающей стороне он уже выглядит как ANYPTR.
Такой параметр ДИН создаёт точку безопасную входа из статически типизированного мира в динамически типизированный.
Второй вариант - это атрибут ДИНХВОСТ. Такой параметр должен быть последним в сигнатуре. При вызове
в него отправляется произвольное число параметров любого типа, кроме неизвестнотиповых,
а принимающая сторона получает массив с типом элемента "укль на динамически типизированный объект",
по числу фактических параметров; элементарные типы опять же оборачиваются в Дин<ЭтотТип>Value.
3. Массивы пока не паханы. Как минимум, не реализован сам тип "укль на динамически типизированный объект".
С помощью рефлексии (уже и без нас) можно узнать всё про массив, но пока нет безопасного
способа обратиться к элементу любого массива. По идее можно расширять набор подтипов типа "укль на любой массив",
но пока недосуг - можно обойтись и опасным VAL. Кроме того, я пока не знаю, как хранятся в массивах расширяемые записи.
Поэтому неясно, какого набора типов будет достаточно и получится ли тут обойтись без параметрических типов.