Не хватало этой возможности. Пойду обновляться…
В билде ещё нет. Это закрыто в 84 билде,а сейчас 82.
Обновился до 84 билда, та программа работает, а эта нет:
type
B = class
x: real;
end;
A = class
b1 := new B;
property X: real read begin value := 1 end write begin b1.x := value; Print(value); end;
end;
var a1 := new A;
begin
a1.X := 2;
a1.X.Print;
end.
Почему?
value - это только в write - как в C#
write генерирует
procedure SetX(value: real);
begin
b1.x := value; Print(value);
end;
Не важно, с Result так же:
type
B = class
x: real;
end;
A = class
b1 := new B;
property X: real read begin Result := 1 end write begin b1.x := value; Print(value); end;
end;
var a1 := new A;
begin
a1.X := 2;
a1.X.Print;
end.
Ругается вообще не на него а на begin
.
А, понял. В read - выражение, в write - оператор Пишите read 1
Это только пример. А если там должна быть функция? Зачем такое ограничение?
Тогда пишите функцию
Как бы Вам это помягче сказать. МЫ разрабатываем язык.
Я конечно всё понимаю, но эта фраза больше нацелена на то чтоб от вас отстали а не объяснить что то.
Вот смотрите, вполне реальный случай - вместо этого:
type
t1=class
public class readed,writed:integer;
private _p1:real;
public property p1:real
read
begin
readed += 1;
Result := _p1;
end
write
begin
writed += 1;
_p1 := value;
end;
end;
begin end.
Придётся писать это:
type
t1=class
public class readed,writed:integer;
private _p1:real;
private function GetP1:real;
begin
readed += 1;
Result := _p1;
end;
public property p1:real
read
GetP1
write
begin
writed += 1;
_p1 := value;
end;
end;
begin end.
Что совершенно не симметрично и ужасно криво.
Это как то сверх сложно реализовать, или есть какие то веские причины запрещать такую запись? Вот это я и спрашиваю.
Да, придётся. В коротких определениях функций то же самое - там тоже нельзя использовать Result.
Если сделать так как Вы хотите, то в нормальных случаях придётся писать не read 0, а read Result := 0; и это в лучшем случае - если не возникнет конфликтов грамматики
Ну почему же. Лучше смотрите как лямбды работают. Мы же пишем:
var l: real->real := x->x*x;
а не
var l: real->real := x->Result := x*x;
Но так же можно и begin end
поставить, и только тогда появляется Result
:
var l: real->real := x->begin Result := x*x end;
То есть в подобном стиле уже работает часть паскаля, и уже известно как реализовать это.
Должно ли работать форматирование в форматной строке? То есть, должно ли это:
var s := $'---{1+1}---';
Форматироваться в это:
var s := $'---{1 + 1}---';
Так уже вроде один раз писали, что форматные строки работают только внутри оператора Write
В смысле, с чего вдруг? Это чисто паскалевские форматные выражения работают только во write
:
write('abc':5)
А форматные строки это .Net фича.
И вопрос вообще не о том был))
Трудно сказать Ошибкой это тоже назвать нельзя. Думаю, это - пожелание.
С того и не вдруг, а форматные строки можно писать только в операторе Write:
Write($'---{1+1}---');
Вы снова пытаетесь из языка сделать C# и возмущаетесь, что в нем не работает что-то, что работает в C#. Вы где-то в Справке видели, что форматная строка может стоять в операторе присваивания?
Нет, нет, тут очередная путаница старого древнего Паскаля и новых возможностей, появившихся в 2017 году.
Старые форматные строки в присваивании стоять не могут.
var a := 2.5:0:4;
Новые форматные строки - могут, они создавались как синтаксический сахар над string.Format:
var a := $'{2.5:f4}';
И это конечно должно работать
Будет работать - я только “за” ! А пока не работает - как могла бы сказать известная лисица о ситуации с виноградом: “ну и не очень то хотелось!” )))
Я так и понял… Но вы лучше скажите - делать ли issue?
Ну как не работает, если работает. Обновитесь.