Мнимые ошибки PascalABC.NET

точно, это же расширение. почему-то забыл про это… спасибо.

но с толку появление Incremental в списке действительно сбило.

и ещё такой вопрос

type
  a = class
    b: integer;
  end;

begin
  var c:= new a[1];
  c.initialize;
  
  c[0].b.print; // Ссылка на объект не указывает на экземпляр объекта.
end.

должно ли так происходить? разве .initialize; не должен был вызвать конструктор c[0]? или я неправильно понимаю описание этого метода?

This method is designed to help compilers support value-type arrays; most users do not need this method. It must not be used on reference-type arrays.

1 лайк

вот оно что. как-то это надо пометить тоже наверно…

этот метод часто мелькает в массивах из контролов winforms. в моём случае RadioButton.

в самописных классах его действительно не видно

Это баг анализатора кода, должно показывать всем типам массивов, потому что это метод типа System.Array - базового класса массивов.

То что его позволяет вызывать для переменных, к которым он не подходит по типу - это проблема архитектуры System.Array, этот метод не должен был быть объявлен общим методом всех массивов.

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

если лямбда возвращает boolean, то необходимо ставить скобки, что бы она адекватно взаимодействовала с not, иначе

Операция not не может быть применена к типу function(): boolean

begin
  var y:= (): boolean -> true;
  print(not y);
end.

так уже работает

begin
  var y:= (): boolean-> true;
  print(not y());
end.

это необходимость или недочёт?

1 лайк

Нет, не баг ) Открыли - и закрыли. Для делегатов not не определён

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

В общем это надо как минимум задокументировать в справке. Или там уже есть что-то на эту тему и я просто не нашёл?

1 лайк

Можно поставить not внутри лямбды:

begin
  var y:= (): boolean -> not true;
  print(y);
end.

Да, нужны. Либо делайте так

begin
  var y:= (): boolean -> true;
  var b: boolean := y;
  print(b);
end.

Делегат преобразуется в вызов функции только в особых случаях. В операциях не преобразуется.

1 лайк

Так не годится. Функция может быть использована в нескольких логический операциях, среди которых not либо нужен, либо нет

Ну и в целом ответ уже есть. Видимо тут только документация

У вас не функция. У вас - делегат, то есть указатель на функцию. Это другой тип

Ну это понятно. Просто в данном случае они используются с одной целью. По этому, на мой взгляд, уместно такое небрежное название

Я хотел инвертировать boolean внутри for. Но почему-то не нашел способ инвертирования значения как в C#:

bool test = false;
test = !test;

В C# это пишется так, но при попытке использовать это в Pascal, компилятор показывает ошибку. Я нашел способ инвертировать её как:

w := w <> true;

Но я уверен что не запомню этот подход и придётся заново изобретать велосипед. Если какой-то другой способ?

Кстати, я проверял

w:=<>w;

компилятор выводит ошибку.

Обнв.

Оказывается можно использовать w:= not w; для этого

Логические операции в паскале пишутся так же как называются. То есть and, or, xor и т.п. - в данном случае not.

1 лайк

Да, только сейчас это пришло мне в голову.

Почему в данном коде

begin
  var s:=[1,5,3]+[2,6,4]+[47,37,27];
  Write(s);
end.

Вывод будет

{47,27,6,5,4,37,2,1,3}

Весь справка говорит, что

Процедура Write при выводе множества выводит все его элементы. Например,<…> при этом данные, если это возможно, будут отсортированы по возрастанию.

В случае set of integer это невозможно?

Да, невозможно. Множество неотсортировано

1 лайк
library lib;

interface
  
type

  rec = record
  end;

implementation

end.

тут для rec есть public static bool op_Equality и

public static bool op_Inequality

а они точно должны быть публичны? захламляют запись же

Так а как их с другого файла вызывать, если они не будут публичны?

если это не внутренние функции, то почему они генерятся в таком виде? если это функции сравнения, то почему не public static bool operator ==