Версия PascalABC.NET 3.4

Со сборки 1670 от 23.05.2018 начала отсчет версия 3.4. Конечно, хорошо что на сайте появилось сообщение в “Что нового”

[24.05.18] Версия 3.4.0.1670

Реализован Pattern Matching. Функция Deconstruct деконструирует объект в переменные
Реализован расширенный оператор is в стиле p is Student(var s)

Все же хотелось бы узнать об этих новых возможностях на каких-то примерах.

Ну допустим is это вроде примерно так же как в C# работает… Вот:

type
  t1=class end;
  t2=class end;
  t3=class end;

begin
  var o:object;
  
  //o := new t1;//разкомментируйте 1 из этих строчек и посмотрите что выведет
  //o := new t2;
  //o := new t3;
  
  if o is t1(var o_t1) then
    writeln($'type is t1 and value is {o_t1}') else
  if o is t2(var o_t2) then
    writeln($'type is t2 and value is {o_t2}') else
  if o is t3(var o_t3) then
    writeln($'type is t3 and value is {o_t3}') else
    writeln($'type is undefined and value is ({o})');
end.

Deconstruct и IsTest объявлены в PABCSystem:

function IsTest<T>(obj: object; var res: T): boolean;
begin
  if obj is T then
  begin
    res := T(obj);
    Result := true;
  end
  else
  begin
    res := default(T);
    Result := false;
  end;
end;

procedure Deconstruct<T>(self: T; var res: T); extensionmethod;
begin
  res := self;
end;

Их вообще ещё в 1 из предыдущих билдов добавили, я думал забыли убрать что то для дебага)

В Примеры/Language Features/Pattern Matching три примера

2 лайка

Про эту же фичу в более приличных языках, но ещё почему-то не реализованную, можно почитать здесь:

1 лайк

Если говорить просто, то pattern matching - это продвинутый case по типам. Нам его как раз для обучения школьников не хватало :wink:

@admin давайте вернёмся к вопросу о лейблах в issue. Всё же разделять issue не так сложно, но обычно (по крайней мере в репозиториях что я видел) к каждой issue прикрепляют несколько лейблов. На сколько я понимаю, для паскаля будет правильно придерживаться указания хотя бы 3 лейблов:

  1. Подгруппа как IDE, formatter bugs, Lambdas и т.п.;
  2. 1 из больших групп, то есть enhancement, bug или wrong error;
  3. Билд в котором эта ошибка воспроизводится.

И так же ещё от случая к случаю возможны дополнительные, как wontfix (указывающая что надо срочно исправить) или old build (как причина закрыть issue).

К примеру у #872 тогда будут лейблы: match bugs, wrong error, bug и v3.4 b1670. Возможно bug лишнее, если считать что wrong error означает не только не правильную, а ещё и ошибку где её быть не должно.

wrong error я не считаю большой группой ошибок

Intellisense ещё большая группа - так она и выделена в отдельную

wontfix - это мы писали тут уже про “надо срочно исправить” - никто не сможет срочно исправить тяжёлую ошибку в случае если разработчик уже ущёл из проекта

Ну, это ваше дело как куда какие группы определить, я лишь изложил основную мысль.

Я так решил потому что вы написали:

Надо бы как-то разделить Issue, связанные с ошибками, багами и Issue, связанные с желаемым расширением языка. А то мы задохнёмся.

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

Баги и ошибки компилятора - это одно и то же

Я имел в виду хотелки вынести в другое место, а то они мне например сильно мешают смотреть на баги

А что тогда оно значит?

А хотелки это разве не enhancement?

Не знаю - не я ставил. Бывают действительно срочные вещи.

Да, они

Ну, под большими группами я как раз имел в виду разделение которое нужно вам, чтоб лишнее не мешало. То есть вот к примеру сделать чтоб у всех хотелок был лейбл enhancement, а у всех багов bug. В таком случае вы нажимаете на лейбл bug у любой issue или вводите в поиск соответствующий фильтр, и вуаля - хотелки уже не мешаются.

А под подгруппами я имел в виду разделение означающее сам вид issue. То есть, к примеру лейбл Intellisense может относится и к багам и к хотелкам. Вы вряд ли будете запускать поиск по этому лейблу, но он поможет вам с 1 взгляда на issue из списка - понять что она относится к анализатору кода.

Вот я это и имел в виду. Дополнительные лейблы как раз для случаев которые бывают, но редко.

wontfix это не будет пофиксено или отложено в самый долгий ящик

На гитхабе 5 часов назад появилось 10 issue с модулем TypeClasses. Можете пожалуйста рассказать что это и с чем его едят? И особенности реализации для паскаля.

Пол часа назад была закрыта самая старая из открытых issue - #265. Теперь можно делать так:

type 
  B = class
    x: real;
  end;
  A = class
    b1 := new B;
    property X: real read b1.x write begin b1.x := value; Print(value); end;
  end;

var a1 := new A;

begin
  a1.X := 2;
  a1.X.Print;
end.
1 лайк