Кстати, если в язык не ввели бы ограниченные встроенные generic-и, то вероятно выкручивались бы традиционно для С-мира -- через какие-то макросы. Видимо, желание быть поближе к скриптовым языкам аля Питон сыграло роль.
А "С-шники" обычно не в курсе "Pascal"-мучений без generic-ов. В своё время была оригинальная библиотека AntiDOT для реализации "STL":
https://sourceforge.net/projects/adot/Код примерно в стиле:
Код:
var
n : TTInteger;
...
n := TTInteger.create(TCVector);
n.add([1,2,3,7,6,5]);
...
Контейнеры как-то сбоку, основная работа через "данные". Для каждого встроенного типа вводится абстракция -- тип-поле контейнера (обычный тип -- некое значение, абстракция выше -- совокупность значений, управляемая неким образом). На примере выше используется вектор. Так используем список (list):
Код:
var
n : TTInteger;
m : TTDouble;
...
n := TTInteger.create(TCList, [TTDouble]);
m := n.fields[1] as TTDouble;
n.AddRecord([1, 0.999]);
...
В create указываем тип контейнера и возможный список (типов) дополнительных полей (в данном случае одно поле).
Так работаем с map:
Код:
var
n : TTDouble;
s : TTString;
...
n := TTDouble.create(TCMultimap, [TTString]);
s := n.Fields[1] as TTString;
n.Map[3.14] := 'Pi';
n.Map[2.72] := 'E';
s[n.Add(1.618)] := 'Golden Ration';
s[n.Add(1.618)] := 'Golden';
...
Все алгоритмы (включая универсальные, т.е. сортировки, поиски и т.д.) через методы "данных", а не контейнеров. Не обычно, но практично. Контроль типобезопасности, нет оверхеда в виде использования каких-то универсальных широких типов аля variant. Нет проседаний скорости, т.к. отсутствуют механизмы косвенного обращения через указатели в каком-то виде (данные хранятся "напрямую" в контейнере, при доступе нет промежуточного обращения через какие-то аля "интерфейсы". Когда необходимо, сами "прикладные" данные могут быть как явный какой-то pointer).
Как для языка "скриптового" уровня даже удобненько, особенно когда структура объектов заранее не известна.
В общем, по-своему качественная концепция, расширяемая для разнообразного применения без усложнений в языке.