Редактировать

Изменения в версии 3.11.0 (1.10.25)

Основное - реализован язык SPython - статическая реализация языка Python

В инфраструктуре PascalABC.NET реализован язык SPython - подмножество языка Python со статической типизацией

Файлы имеют расширение .pys, программы работают с той же скоростью, что и программы на PascalABC.NET и C# и в штатных сценариях (без вызова библиотечных функций) - примерно в 100 раз быстрее Python - программ.

Также реализована поддержка многоязыковости в инфраструктуре PascalABC.NET - от компилятора, таблицы символов и системы модулей до поддержки в оболочке (например, Intellisense). Пока отсутствует поддержка дебаггера.

# Hello.pys
print('Привет! Это SPython!')

Новые конструкции в языке PascalABC.NET

Оператор exit(param)

Теперь в функциях можно использовать exit(param) для моментального возврата значения

function FastPower(a: real; n: integer): real;
begin
  if n = 0 then exit(1); // a^0 = 1
  if n = 1 then exit(a); // a^1 = a
  if n < 0 then exit(1 / FastPower(a, -n)); // отрицательная степень
  
  var half := FastPower(a, n div 2);
  if n mod 2 = 0 then exit(half * half); // чётная степень
  exit(half * half * a); // нечётная
end;

Распаковка KeyValuePair

Значение типа KeyValuePair можно распаковать в переменные

var t := 2 to 3.5;
  var (a,b) := t;
  Println(a,b);
  foreach var (a1,b1) in Dict(1 to 7, 22 to 555) do
    Println(a1,b1);

Инициализация элемента массива пустой коллекцией

Элемент массива, который сам является массивом, теперь можно инициализировать пустой коллекцией

begin
  var a: array of array of integer := [[],[],[1]];
  Println(a,TypeName(a));
  var b := [[],[1],[]];
  Println(b,TypeName(b));
  var aa: array of array of array of integer := [[[],[2]],[]];
  Print(aa,TypeName(aa));
end.

Изменения в стандартоном модуле

Внешние функции Between и InRange

Внешние функции Between и InRange реализованы для любого типа, удовлетворяющего IComparable

begin
  Between(6,2,6).Print;
  Between(6,2,6,inclusive := False).Println;
  var dt1 := DateTime.Create(2025,04,16);
  var dt3 := DateTime.Now;
  Between(DateTime.Now,dt1,dt3).Print; 

  // Поведение изменено!! Теперь диапазон [6,2] считается пустым
  InRange(5,2,6).Println;
end.

Новый стандартный метод последовательностей AdjacentGroupBy

AdjacentGroupBy группирует соседние одинаковые по ключу элементы. Возвращает последовательность групп

type
  Player = auto class
    Name: string; Score: integer;
  end;  

function GetPlayers := [
  new Player('Alice', 95),
  new Player('Bob', 95),
  new Player('Charlie', 110),
  new Player('Diana', 110),
  new Player('Karina', 120)
];

begin
  var leaderboard := GetPlayers;
  foreach var group in leaderboard.AdjacentGroupBy(p -> p.Score) do
  begin
    Println(group.Key);
    group.Println;
  end;
end.

Новый стандартный метод последовательностей IsOrdered и его производные

type
  Player = auto class
    Name: string; Points: integer;
  end;  

function GetPlayers := [
  new Player('Alice', 120),
  new Player('Bob', 95),
  new Player('Charlie', 130),
  new Player('Diana', 110)
];

begin
  var leaderboard := GetPlayers;
  Println(leaderboard);
  if not leaderboard.IsOrderedByDescending(p -> p.Points) then
    Println('Рейтинг составлен неверно!');

  leaderboard := leaderboard.OrderByDescending(p -> p.Points).ToArray;
  Println(leaderboard);
  if leaderboard.IsOrderedByDescending(p -> p.Points) then
    Println('Теперь рейтинг составлен верно!');
end.

Устранение багов

Устранен ряд утечек памяти в Intellisense

AbcObjects для Linux

Модуль AbcObjects адаптирован для работы в Mono под Linux