Дож писал(а):Кому, кстати, за массивы спасибо говорить? Borland'у за введение их в Delphi
хз, каким авторам языков высокого уровня. Конструкция "массив каких-либо данных". Изначально такой "дженерик" был во всех языках.
Но Борланд действительно, сделали массивы динамическими.
Дож писал(а):а мне бы отвечали что-нибудь вроде «Не нужны динамические массивы, паскаль — это вам не Java! Код пишется для того, чтобы его читать, а не быстро писать! С динамическими массивами код разбухает, оно нам надо?»
И я уверен, что такие аргументы были, в среде old-school паскалистов. И скорей всего такой код, где используеются New / Dispose / GetMem

всё ещё существует и даже используется.
Не нужно забывать, что динамические массивы несут с собой нагрузку в виде ref-counting-а, и вообще это managed тип. Т.е. динамеческий массив противен тем, кто привык всё делать руками

Дож писал(а):Безусловно, предложенное решение через if'ы со знанием о дженериках в рантайме — это ужасно.
Не. Там именно что в компайл тайме все IF-ы разруливаются. Ран-тайм не страдает. Это ужасно с точки зрения поддержки исходного кода.
Дож писал(а):Для дебаггера нужно отображение «машинная инструкция -> строчка в исходнике», а не наоборот, так что не очень понятно почему это должно быть проблемой.
...
Какая связь между отладчиком и типами данных в исходном коде (т.е. некоторой языковой абстракцией)?
Бряк поинты часто ставятся на основне "строчка в исходнике -> машинная инструкция".
Получается что если где-то в коде генерика поставить брякпоинт, то останавливатся должна каждая специализация.
Что в принципе терпимо, но может быть и не приятно, в том случае, если отлаживается код, где один генерик специализирован много раз. (Что кстати и должно происходить)
(Нечто подобное возникает при попытке Step-In, когда есть бряк-поинт в одной из функций, которые должны вычислить значение параметров для функции в которую Step-in и происходит. Программа остановится на бряк-поинте ещё не достингнув начальной точки процедуры.)
---------
Вынесу отдельно, т.к. прикладная часть
Дож писал(а):Во всяком случае, для невероятно частых операций «добавить элемент в массив» и «обратиться к последнему элементу массива» до сих пор нет удобных конструкций, приходится для каждого инстанса массивов вручную фигачить связки (SetLength(Length+1) и A[High(A)] соотвественно), потому что «так лучше читается».
* SetLength(length+1) - медленное зло. Нужно завести отдельную Count переменную (для логического размера), а физический размер экспоненциально увеличивать.

* А я использую A[ length(a)-1]

Вопрос: в каких алгоритмах нужно получить "последний элемент массива"?
И как должна вести себя такая функция, в том случае, если массив пуст? (runtime error? false? exception? дефолтное значение?)
Если рассматривать динамический массив, как низкоуровневую структуру, тогда нужно использовать TList. И его
Последний элемент.