begin
var (x,y,z) := ReadReal3;
Writeln( x**y**z ); //Ошибка: Встречено '**', а ожидался оператор
end.
Можно ли считать это багом?
С одной стороны - с чего вдруг этому не компилироваться?
А с другой - заменить выражение на x**(y*z) всегда будет правильнее, потому что это быстрее посчитается.
Это однозначно баг, поскольку синтаксис арифметического выражения во всех языках, где есть операция возведения в степень, допускает запись вида a ** b ** c, причем это единственный случай, когда операции выполняются в порядке справа налево, т.е. эквивалентно a ** (b ** c). Именно так это реализовано в Basic, Fortran, Python.
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.
Проблема (?) в расширенном свойстве с возвращаемым значением 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.
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 говорилось, что расширение и без того уже расширенного синтаксиса свойств может повлечь некоторые проблемы.
Если кто то это по поиску найдёт - я обычно пишу boolean(true) и т.п. Преобразование типа к самому себе ничего не делает, но с ним компилятор сразу понимает что это новый синтаксис свойств.
И во write можно ставить exit(), если нужен пустой оператор, он короче чем begin end;, а скобки после него, опять же, дают понять что это новый синтаксис.
В PascalABC.NET 3.5.1.2277 компиляция завершается с сообщением, что скомпилировано 0 строк, но IDE работает нормально. Стоит отметить, что если скомпилировать иную программу в n строк, то при компиляции той, которая в Issue, будет показываться сообщение о том, что скомпилирована программа в n строк.