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


#209

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

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

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

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


#210

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


#211

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


#212
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 решает проблему.


#213

Проблема (?) в расширенном свойстве с возвращаемым значением 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.

#214

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

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

begin
end.

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


#215

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

const N = 10;

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

begin
end.

#216

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


#217

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

Понял.

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


#219

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


#220

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

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


#221

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


#222

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


#223

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

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


#224

Ещё раз:

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

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


#225

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