Тривиль — обобщенные типы — претендую на рекорд Гиннесса

Сделал реализацию обобщенных (generic) модулей (именно модулей, а не типов или функций). Добавил в компилятор меньше 150 строк, думаю, что это рекорд реализации.

Выглядит более коряво, чем обычные generic types, но для Тривиля в самый раз.

Работает так: можно написать обобщенный модуль, например:

модуль стек

тип Элементы = []Элемент

тип Стек* = класс {
элементы = Элементы[]
верх: Цел64 := 0 // … [0..верх[
}

/* далее методы */

Тип элемента стека — «Элемент» в этом модуле не определен, он будет определен при конкретизации.

И далее, пишем «конкретизацию»:

модуль стек-цел
конкретизация «стд/контейнеры/стек» («Элемент»: «Цел64»)

Эти две строки составляют весь модуль «стек-цел». Его можно импортировать обычным образом:

импорт «модули/стек-цел»

И использовать: пусть с = стек-цел.Стек; с.положить(1)

Компилятор возьмет модуль «стд/контейнеры/стек», и сделает из него стек-цел, добавляя: тип Элемент = Цел64 и компилируя обычным образом. Точно так же можно определить стек чего-угодно.

В итоге получаем эффективность на уровне С++ за счет мономорфизации, при этом трудоемкость добавления в компилятор близка к нулю, и все делается во время компиляции.

Стек использую для отладки, потому что проще некуда. Теперь можно написать HashMap — и начать раскрутку компилятора.

Пока писал эту заметку, понял, что можно еще упростить и сделать более универсальным…

4 комментария


  1. Да, но имхо — это классические интерфейсы. И не уловил сути про обобщённые модули. Оно точно надо?)
    У Вирта есть базовый тип и далее выбор типа (через перебор типов или захват типа объекта).
    На сколько нужны типы модулей?

    Ответить

    1. Совсем не интерфейсы…
      Видимо, я не смог донести мысль — дописал сегодня главу в описание языка, может, там будет понятнее: ссылка

      Ответить

  2. Похоже на макросы. По поводу преимуществ – согласен. Хочу добавить несколько слов про недостатки:
    1) неявность – в больших модулях можно и пропустить, что тип Элемент не имеет определения, что он является по-сути дженерик параметром;
    2) так же, как и в C++, компилятор будет выдавать ошибки в терминах уже «настроенных» типов. Это затрудняет работу по исправлению ошибок, найденных компилятором.

    Не знаю, планируется ли реализация других контейнеров, например, упорядоченных множеств. Если планируется, то имеет смысл заложить возможность добавлять ограничения на дженерик параметры.

    Ответить

    1. Посмотри главу в описании, частично я там тебе ответил еще до того, как прочитал твой комментарий :)
      1) Комментарий в заголовке
      2) Ошибки: ошибки выдает с указанием места в исходном обобщенном модуле. Да, в каких-то случаях может быть неудобно.

      Ответить

Добавить комментарий для apolyakov Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *