Странно, а я вроде раньше её скачать смог… Насчёт реализации - для всех ** было использовано обычное Power(real,real):real. Может стоит для integer сделать Power(integer,integer):int64? Я мог бы реализовать 1 из быстрых алгоритмов для целочисленного возведения в степень и сделать пулл реквест. Есть какие то принципиальные возражения почему это не подходит паскалю?
Это нельзя сделать, так как степень может быть отрицательная. А ограничителей where T: integer and T > 0 у нас нет.
Главное, чтобы появилась операция **, а уж перегрузить её, если что, можно и самостоятельно. Конечно, приятнее, привычнее и короче было бы видеть не , а ^, но уж коль Н.Вирт закрепил за ^ указатели - тут уж не попляшешь. У меня вот чешутся руки на возведение в степень матриц и простых дробей, потому что через Power() некрасиво смотрится. Ведь тогда можно определить для матрицы a(-1) как операцию нахождения обратной матрицы и это куда ближе к принятой в линейной алгебре нотации, чем a.Inv или Inv(a).
Ну да действительно… Кстати новая версия только что вышла.
Ну, были тут обсуждения:
Julbin считает, что это затратно. А у нас эффективный компилятор 
В таком случае может сделать директиву на это?
Ну да: Вы сделаете, а мы - директиву 
Я бы не стал завязываться на убогие диапазоны. А в настоящих рефайнмент-типах должна быть проверка на выход за диапазон. Это можно реализовать на базе структур и перегруженных операций, включая implicit
type posnumber = integer where value > 0;

Ну всё же с Power это не пройдёт, получается что у возвращаемого значения будет меняться тип и определить его на этапе компиляции не получится если второе число не константное. Тут единственный вариант это делать перезагрузку операции по случаю, можно разве что добавить функцию IntPow, как полностью отдельную. А реализовать диапазонные типы не сложно, но опять же смысла в них сильно большого не будет потому что выбор подпрограммы с ними никак не заменить.
Хотелось бы иметь две процедуры для реализованного подмножества операций с матрицами:
procedure SortByRow<T>(a:array[,] of T; row:integer; descending:boolean:=False);
procedure SortByCol<T>(a:array[,] of T; col:integer; descending:boolean:=False);
Сортировка двумерного массива встречается в задачах не так уж редко, а её реализация с прицелом на стиль функционального программирования выглядит на мой малопросвещенный взгляд достаточно некрасиво, что портит общий вид решения (по крайней мере, мне не удалось сделать привлекательный код). У нас уже есть Sort для одномерных массивов, почему бы не сделать подобное счастье для двумерных?
В плане реализации, быть может, имеет смысл получить уже имеющейся сортировкой одномерной последовательности нужный порядок ключей, а затем произвести необходимые перестановки строк (столбцов), либо выполнить копирование через промежуточную матрицу. Копирование проще в реализации, а матрицы размером 1000000х1000000 вряд ли кто-то будет сортировать. С другой стороны, решение задачи об оптимальном количестве перестановок в соответствии с ключами - это красиво.
Собственно, я пробную реализацию написал, вроде не самая плохая 
procedure SortByRow<T>(a:array[,] of T; row:integer; descending:boolean:=False);
begin
  if descending then begin
    var b:=a.Row(row).Select((v,i)->(v,i)).OrderByDescending(q->q[0])
      .Select(q->q[1]).ToArray;
    for var i:=0 to a.ColCount-2 do begin
      var j:=b[i];
      a.SwapCols(i,j);
      b[b.IndexOf(i,i)]:=j;
      end
    end
  else begin
    var b:=a.Row(row).Select((v,i)->(v,i)).OrderBy(q->q[0])
      .Select(q->q[1]).ToArray;
    for var i:=0 to a.ColCount-2 do begin
      var j:=b[i];
      a.SwapCols(i,j);
      b[b.IndexOf(i,i)]:=j;
      end
    end;
end;
begin
  var M:=MatrRandom(5,6,1,9);
  M.Println(2);
  Writeln(2*M.ColCount*'-');
  SortByRow(M,2,True);
  M.Println(2)
end.
Объединить две ветки не смог: ругается на возникающую несовместимость типов.
А можно пример кода вызывающий ошибку? Он ведь не должен ругаться…
procedure SortByRow<T>(a:array[,] of T; row:integer; descending:boolean:=False);
begin
  var b:array of T;
  if descending then
    b:=a.Row(row).Select((v,i)->(v,i)).OrderByDescending(q->q[0])
      .Select(q->q[1]).ToArray
  else
    b:=a.Row(row).Select((v,i)->(v,i)).OrderBy(q->q[0])
      .Select(q->q[1]).ToArray;
  for var i:=0 to a.ColCount-2 do begin
    var j:=b[i];
    a.SwapCols(i,j);
    b[b.IndexOf(i,i)]:=j;
    end
end;
SortByRow.pas(6) : Нельзя преобразовать тип array of integer к array of T
Т.е. при инстанцировании происходит замена обобщенного класса Т в заголовке процедуры, а в теле не меняется. Попытка написать тип Т в объявлении b как < T > или &< T > тоже безуспешна.
Проходит только так, но это извращение:
  var b:=a.Row(row).Select((v,i)->(v,i)).OrderBy(q->q[0])
      .Select(q->q[1]).ToArray;
  if descending then
    b:=a.Row(row).Select((v,i)->(v,i)).OrderByDescending(q->q[0])
      .Select(q->q[1]).ToArray;
        procedure SortByRow<T>(a:array[,] of T; row:integer; descending:boolean:=False);
begin
  var b:=descending?
    a.Row(row).Select((v,i)->(v,i)).OrderByDescending(q->q[0]).Select(q->q[1]).ToArray:
    a.Row(row).Select((v,i)->(v,i)).OrderBy(q->q[0]).Select(q->q[1]).ToArray;
  for var i:=0 to a.ColCount-2 do begin
    var j:=b[i];
    a.SwapCols(i,j);
    b[b.IndexOf(i,i)]:=j;
    end
end;
        Спасибо, вариант, конечно. Но хотелось бы понять, как поступать в общем случае…
Это конечно да, но я не сильно понял как это работает, можете привести более простой пример?
Что - “это”? Инстанцирование? Работа с обобщенным типом? Я тоже не сильно в нем разбираюсь - все исключительно по системе Справки.
— Скажи мне, о Волька! Что означает слово «балда»?
— Понимаешь... Ну это, вроде как мудрец.
Видимо, бывают дни, когда писать программы противопоказано. Какой тут тип T, когда получается всегда integer? Вот и получаешься сам себе злобный буратино…
P.S. Попутно выяснилось, что если использовать в процедуре не массив, а список, получается выигрыш во времени исполнения 4-5%.
Окончательно фрагмент кода;
var b:=descending ?
    a.Row(row).Select((v,i)->(v,i)).OrderByDescending(q->q[0])
      .Select(q->q[1]).ToList :
    a.Row(row).Select((v,i)->(v,i)).OrderBy(q->q[0])
      .Select(q->q[1]).ToList; 
        
 Институт математики, механики и компьютерных наук ЮФУ, 2005–2021