Ошибки компилятора PascalABC.Net

Два возведения в степень подряд не работают:

begin
  var (x,y,z) := ReadReal3;
  Writeln( x**y**z ); //Ошибка: Встречено '**', а ожидался оператор
end.

Можно ли считать это багом?

С одной стороны - с чего вдруг этому не компилироваться?
А с другой - заменить выражение на x**(y*z) всегда будет правильнее, потому что это быстрее посчитается.

Это однозначно баг, поскольку синтаксис арифметического выражения во всех языках, где есть операция возведения в степень, допускает запись вида a ** b ** c, причем это единственный случай, когда операции выполняются в порядке справа налево, т.е. эквивалентно a ** (b ** c). Именно так это реализовано в Basic, Fortran, Python.

5 лайков

Помогла переустановка программы,сейчас всё работает

1 лайк
type
  T0<T> = class
    procedure P1() := exit;
  end;
  
  T1 = class
    function F1<T>(): T0<T> := nil;
  end;
  
begin
  var b := new T1();
  
  b.F1.p1; // If I add braces here compiler will show compilation error as expected.
end.

Добавление скобок после F1 решает проблему.

Проблема (?) в расширенном свойстве с возвращаемым значением boolean в следующем коде:

type
  T = class
  public
    //property A[i: integer]: boolean read true write begin end; // Name in property read section must be field name or method name of this class
    property B[i: integer]: integer read 1 write begin end;
    property C[i: integer]: real read 1.2 write begin end;
    property D[i: integer]: char read 'a' write begin end;
    property E[i: integer]: string read 'Hello world!' write begin end;
  end;

begin
end.

Нет. Проблема в булевых литералах.

type
  T = class
  public
    property A[i: integer]: boolean read boolean.Parse('true') write begin end;
  end;

begin
end.

Так работает. Надо разрешить булевые константы в этом контексте.

А, нет! Проблема вообще со всеми константами:

const N = 10;

type
  T = class
  public
    property A[i: integer]: integer read N write begin end; //Program1.pas(6) : Имя в секции read свойства должно быть именем поля или функции-метода этого класса
  end;

begin
end.

А вы читаете вообще ошибку, которая при этом выдаётся? Ошибка свидетельствует, что это прогнозируемое и правильное поведение компилятора.

Я лишь сказал, что в свойстве из приведенного мною примера с возвращаемым типом boolean ошибка компиляции происходит. Вывод о том, происходит ли это с константами или только со свойствами с возвращаемым значением типа boolean я и не делал.

Понял.

Я сказал, что в приведённом мною коде есть проблема, но я ничего не говорил о том, ошибка ли компилятора это или нет. Более того, исходя из ответа @Admin это так и задумано, так что менять что-то в языке смысла я не вижу. Вспомним, что самим @Admin говорилось, что расширение и без того уже расширенного синтаксиса свойств может повлечь некоторые проблемы.

Это необходимое зло совмещения старых и новых (расширенных) свойств. В старых свойствах если имя в read, то это или функция или поле.

1 лайк

Если кто то это по поиску найдёт - я обычно пишу boolean(true) и т.п. Преобразование типа к самому себе ничего не делает, но с ним компилятор сразу понимает что это новый синтаксис свойств.

И во write можно ставить exit(), если нужен пустой оператор, он короче чем begin end;, а скобки после него, опять же, дают понять что это новый синтаксис.

Насколько помню, возможность писать скобки после exit выяснилась относительно давно, поэтому я не уверен «новый» ли это синтаксис.

Скобки после exit это вообще не фича синтаксиса. И речь шла про синтаксисы свойств.

Тогда, извините, не понимаю:

как скобки после exit позволяют понять, что это «новый синтаксис». Без них он «старый»?

Ещё раз:

Это относилось к многочисленным:

Ну и типа да, если поставить во write свойства exit без скобок - компилятор принимает это как старый синтаксис.

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

В PascalABC.NET 3.5.1.2277 компиляция завершается с сообщением, что скомпилировано 0 строк, но IDE работает нормально. Стоит отметить, что если скомпилировать иную программу в n строк, то при компиляции той, которая в Issue, будет показываться сообщение о том, что скомпилирована программа в n строк.

{$reference ABCNET.dll}
uses ABCNET.Utils;
uses ABCNET.Extensions;
begin
  Arr.Rand(Base.ReadInteger('N:'), -20, 25).Println().Numerate().MinBy(x -> x.Item).Index.Println();
end.

Пример взят отсюда.

Надо или без библиотеки, или по крайней мере оставить от библиотеки минимальный код.

{$reference System.Memory.dll}
//Ошибка: Сборка 'System.Memory.dll' не найдена

begin
  var s: System.Span<byte>;
end.

Студия позволяет успешно использовать System.Span, не подключая никаких дополнительных .dll . Это проблема паскаля, или я чего то не понимаю?