Версия PascalABC.NET 3.4

А-а-а… Неправильно прочитал :slight_smile: Да, автоклассы.

Ну, автоклассы в их сегодняшнем воплощении для этого не используются. Мы думаем заменить автоклассы record-классами в стиле нового C#. Или оставить их одновременно. Это всё надо улучшать, но Issue написан грязно, потому и закрыли. А так - когда оформится мысль - сделаем и без всякого Issue.

1 лайк

А когда будет исправлена ситуация со статическими классами?

Как все запущено… уже не только просто хотелки, а со сроками…

"... и к исходу сентября
мне роди богатыря"

еще не пришли к консенсусу. какое ключевое слово использовать.

А конвульсиум сзывали?

begin
  var f := System.IO.File.OpenRead('temp.txt');
  try
    f.ReadByte;
  finally
    f.Close;
  end;
end.

Разворачивается в:

begin
  var f := System.IO.File.OpenRead('temp.txt');
  var flag: boolean;
  try
    f.ReadByte;
    
    flag := true;
    raise new Exception;
  except
    on e: Exception do
    begin
      f.Close;
      if not flag then
        raise e;  
    end;
  end;
end.

Зачем? В СIL ведь есть finally, и вы уже его использовали в другом участке компилятора:

begin
  foreach var o in Seq(0) do
end.

Разворачивается в:

begin
  var enm := Seq(0).GetEnumerator;
  try
    while enm.MoveNext do
      System.Convert.ToInt32(enm.Current);
  finally
    enm := nil;
  end;
end.

P.S. а не надо ли начать новую тему для 3.4? уже ведь 3.4.2 …

Начните

Ну хорошо, так а что по вопросу то? Ваша реализация поидее работает на много медленнее, чем если нормальный finally использовать…

А, странно, она уже есть… А поиск не нашёл. @Gleb перенесите пожалуйста.

В каком состоянии находится static?

Куда?

туда. Есть же выше ссылка.

Ну так всё же, @Admin, @ibond , как насчёт ответить на вопрос про finally?

1 лайк

В match разрешает и ставить и не_ставить var:

begin
  match 0 with
    real(r): ;
    byte(var b): ;
  end;
end.

Но при этом не разрешает Не ставить переменную:

begin
  match 0 with
    integer: writeln('0 это integer');//ошибка
  end;
end.

Что из этого так и задумано, а что недоработка?

Так и задумано

А почему запрещено не создавать переменную? Ведь не всегда надо делать это преобразование, бывают случаи когда достаточно знать тип переменной. Это разрешено:

try
except
  on ArgumentException do writeln('неправильные аргументы');
  on e: Exception do writeln(e);
end;

Можно предположить, что разработчики делали match-with с оглядкой на switch (для типов) из C#. Тем более, для проверки соответствия типов можно пользоваться оператором is. Хотя, я с Вами согласен, что снятие запрета может сделать код более компактным.

Ну так а зачем тогда запрещать размерные ограничители?

Для ваших целей используйте if a is B

Мы уже закрыли эту тему. Все аргументы мои были размещены ранее. Тем более, в данном случае (ограничений) запрет в плане краткости кода никому не навредит. Не вижу смысла поднимать этот вопрос.