Замечания и предложения

Разумеется, это можно потом прилепить к срезам. А пока что реализовать с запретом присвоения левой части.

Это надо начинать с одномерных срезов

2 лайка

Ну с этим я не спорю. но одномерные срезы - тоже срезы.

А там, глядишь, появится полноценный тернарный оператор, а не только выражение. Правда, не знаю, зачем он, но все равно занятно.

Это уже заявка будет на памятник при жизни. Ну хорошо, не памятник…бюстик у входа на кафедру.:grinning:

1 лайк

Смотрю заголовок:

function CheckAndCorrectFromToAndCalcCountForSystemSlice(
     situation: integer; Len: integer; var from, &to: integer; step: integer):
     integer;

Возникает вопрос, каким должен быть набор параметров для матрицы. Все параметры задвоены будут? situarionRow, situationCol, LenRow, LenCol, … и что возвращать будем? Кортеж (integer, integer) ? Или просто будет еще какой-то модуль, вызывающий эту функцию дважды - для строки и столбца?

Не знаю. Это как Вы решите. Делайте попроще чтобы можно было разобраться. Навскидку - вызывать 2 раза по каждой размерности

Саму реализацию среза я написал. Как раз проблема вся в том, чтобы её вызывать с подготовленными параметрами, но вызов в компиляторе закамуфлирован. Можно только проследить, как идет вызов при обращении к расширению a.Slice( ), но не a[x:y:z].

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

Summary
function CreateSliceFromArrayInternal<T>(Self:array[,] of T;
    RowFrom, RowStep, &RowCount, ColFrom, ColStep, &ColCount : integer) :
    array[,] of T; 
begin
  Result := new T[&RowCount,&ColCount];
  var iRow := RowFrom;
  for var i := 0 to &RowCount-1 do
    begin
    var jCol := ColFrom;
    for var j := 0 to &ColCount-1 do
      begin
      Result[i,j] := Self[iRow,jCol];
      jCol += ColStep
      end;
    iRow += RowStep  
    end
end;

procedure CorrectCountForSlice(Len, from, step: integer; var count: integer);

// ТУТ Я НЕ СМОГ ВЫЗВАТЬ ОДНОИМЕННУЮ ПРОЦЕДУРУ ИЗ PABCSYSTEM !!!
// А ИНАЧЕ ЭТА ПРОЦЕДУРА НЕ НУЖНА

begin
  if step = 0 then
    //raise new ArgumentException(GetTranslation(PARAMETER_STEP_MUST_BE_NOT_EQUAL_0));
    begin
    Writeln('PARAMETER_STEP_MUST_BE_NOT_EQUAL_0');
    Exit
    end;
  if count < 0 then
    //raise new ArgumentException(GetTranslation(PARAMETER_COUNT_MUST_BE_GREATER_0));
    begin
    Writeln('PARAMETER_COUNT_MUST_BE_GREATER_0');
    Exit;
    end;
  if (from < 0) or (from > Len - 1) then
    //raise new ArgumentException(GetTranslation(PARAMETER_FROM_OUT_OF_RANGE));
    begin
    Writeln('PARAMETER_FROM_OUT_OF_RANGE');
    Exit;
    end;
  var cnt := step > 0 ? Len - from : from + 1; 
  var cntstep := (cnt - 1) div abs(step) + 1;
  if count > cntstep then 
    count := cntstep;
end;

function SliceArrayImpl<T>(Self: array[,] of T; from1, step1, count1, from2, step2, count2: integer): array[,] of T;
begin
  CorrectCountForSlice(Self.RowCount, from1, step1, count1);
  CorrectCountForSlice(Self.ColCount, from2, step2, count2);  
  Result := CreateSliceFromArrayInternal(Self, from1, step1, count1, from2, step2, count2)
end;

/// Возвращает срез матрицы по строкам от индекса from1 с шагом step1 длины не более count1
/// Возвращает срез матрицы по колонкам от индекса from2 с шагом step2 длины не более count2
function Slice<T>(Self: array[,] of T; from1, step1, count1, from2, step2, count2: integer): array[,] of T; extensionmethod;
begin
  Result := SliceArrayImpl(Self, from1, step1, count1, from2, step2, count2);
end;

begin
  var a := MatrGen(9, 9, (i,j) -> 10*(i+1)+j+1);
  a.Println(3);
  Writeln;
  var b:=a.Slice(0,3,2,2,2,3);
  b.Println(3);
end.

Хотелось бы узнать, что из PABCSystem.pas можно безболезненно удалить?

Можете, пожалуйста разрешить следующее:

procedure p1(f: real->real := r->r);
begin
  
end;

begin end.

То есть указание значения по умолчанию для параметра - указателя на функцию, не создавая отдельное имя типа:

function f1(r:real) := r;

procedure p1(f:real->real := f1);
begin
  
end;

begin end.

Нет. В C# такого нет. И это - очень тяжело реализуемое.

Думаю, это на свой страх и риск. Вот, удаляете CreateSliceFromArrayInternal - и срезы перестают работать, да ещё и с падением компилятора. Оно Вам надо?

Так… “мазохизЬм” еще никто не отменял…

Спасибо! А компилятор будет постоянно падать, или только в каких-то случаях?

Только если Вы будете использовать соответствующую конструкцию. Если нет, код будет генериться нормальный

Я пишу программы на чистом .NET в стиле C#, поэтому никакие стандартные средства из PABCSystem мне не требуются.

Тогда пишите на C#. Тут нет никакой альтернативы.

PABCSystem пронизан синтаксическим сахаром.

В том то и дело, что Паскаль мне нравится больше, чем C#.

Вот именно поэтому я и спрашиваю про то, как его уменьшить(в идеале-отключить).

Мы такого специально не планировали. Поэтому Вы это делаете на свой страх и риск

Да да, я понял… Но всё равно, спасибо за информацию! :slight_smile:

Можно ли сделать директиву компилятора, определяющую необходимость генерации PDB? При компиляции из файлового меню, отладочная информация генерируется всегда. Кроме того, в среде периодически появляется галочка в соответствующем поле настроек компилятора, что делает необходимым периодическое её отключение.

1 лайк