Версия PascalABC.NET 3.4

Не хватало этой возможности. Пойду обновляться…

В билде ещё нет. Это закрыто в 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 фича.

И вопрос вообще не о том был))

Трудно сказать :slight_smile: Ошибкой это тоже назвать нельзя. Думаю, это - пожелание.

С того и не вдруг, а форматные строки можно писать только в операторе Write:

Write($'---{1+1}---');

Вы снова пытаетесь из языка сделать C# и возмущаетесь, что в нем не работает что-то, что работает в C#. Вы где-то в Справке видели, что форматная строка может стоять в операторе присваивания?

Нет, нет, тут очередная путаница старого древнего Паскаля и новых возможностей, появившихся в 2017 году.

Старые форматные строки в присваивании стоять не могут.

var a := 2.5:0:4;

Новые форматные строки - могут, они создавались как синтаксический сахар над string.Format:

var a := $'{2.5:f4}';

И это конечно должно работать

Будет работать - я только “за” ! А пока не работает - как могла бы сказать известная лисица о ситуации с виноградом: “ну и не очень то хотелось!” )))

Я так и понял… Но вы лучше скажите - делать ли issue?

Ну как не работает, если работает. Обновитесь.