Изменения в версии 3.11.1 (03.02.26)
Основное - реализован новый модуль DataFrameABC для промышленной работы с датасетами
Возможности DataFrameABC:
- Постолбцовое хранение данных (column-store) для высокой производительности
- Типизированные столбцы: int, float, string, bool с поддержкой NA
- Cursor API для эффективного построчного обхода без лишних аллокаций
- Фильтрация строк с пользовательским предикатом (
Filter) - Изменение схемы таблицы:
Select,Drop,Rename - Добавление вычисляемых столбцов:
WithColumn* - Группировка данных и агрегаты (
GroupBy) - Соединение таблиц: Inner / Left / Full Join (один и несколько ключей)
- Описательная статистика:
Count,Mean,Std,Min,Max,Describe - Загрузка данных из CSV и многострочного CSV-текста
- Удобный вывод больших таблиц с предпросмотром (
Print/PrintPreview)
Семантика операций:
Select/Drop/Rename→ view (без копирования данных)Filter/Join/Sort/WithColumn→ materialize (создаются новые массивы)Countсчитает только валидные (non-NA) значения
Пример:
uses DataFrameABC;
begin
var df := DataFrame.FromCsvText('''
name,age,score
Alice,20,85
Bob,22,90
Charlie,21,78
Bob,22,90
Clara,,78
Kat,21,NA
''');
df.Filter(row -> row.Int('age') > 20).Println;
df.GroupBy('age').Mean('score').Println;
var stat := df.Describe('score');
Println($'score: count={stat.Count}, min={stat.Min}, max={stat.Max}, mean={stat.Mean}, std={stat.Std.Round(3)}');
end.
Изменения в языке PascalABC.NET 3.11.1
Контейнеры в интерполированных строках
Теперь в интерполированных строках в качестве значений можно использовать любые контейнеры - они будут интерполироваться до соответствующего значения
begin
Println($'{Arr(1,2,3)}');
Println($'{Lst([1,2],[3,4])}');
Println($'{SetOf(1,2,3)}');
end.
Будет выведено
[1,2,3]
[[1,2],[3,4]]
{1,2,3}
Паскалевский спецификатор формата данных в Println
В Print - Println, так же как и в Write, можно теперь использовать паскалевские спецификаторы формата данных
Print(Pi:0:4)
Изменения в стандартных функциях
ArrRandomInteger и MatrRandomInteger с диапазоном
Функции ArrRandomInteger и MatrRandomInteger могут теперь принимать диапазон, что воспринимается естественнее чем 2 параметра:
begin
var a := ArrRandomInteger(10,5..10);
a.Println;
var m := MatrRandomInteger(3,4,2..9);
m.Println(3);
end.
Параметр Digits в методе ToString для массива вещественных
При преобразовании масива вещественных в строку можно указать, сколько цифр после десятичной точки учитывается. Это аналогично методу ToString для индивидуального значения типа real:
begin
var a := ArrRandomReal(5);
var s := a.ToString(1);
Println(s);
var r: real := 3.14;
s := r.ToString(1);
Println(s);
end.
Вывод:
1.3 1.5 0.4 9.8 1.3
3.1
Параметр allowOverlap в методе CountOf
В методе CountOf для последовательностей появился необязательный параметр allowOverlap, позволяющий учесть наложения
begin
var s := 'arara';
s.CountOf('ara').Println;
s.CountOf('ara',allowOverlap := True).Println;
end.
Вывод:
1
2
Новые стандартные функции и методы
Кубический корень - работает и с отрицательными числами
Print(CbRt(-27));
Метод Copy для массивов и матриц
Для клонирования массивов и матриц можно теперь использовать стандартный метод Copy
begin
var a := [1,3,5];
var a1 := a.Copy;
Println(a1);
var m := Matr([2,4,6],[3,5,8]);
var m1 := m.Copy;
Println(m1);
end.
Стандартные функции GCD, GCM
Функции нахождения наибольшего общего делителя и наименьшего общего кратного теперь - в стандартном модуле
##
var (a,b) := (56,98);
var GCD := GCD(a, b);
var LCM := LCM(a, b);
Стандартная функция Hypot
Стандартная функция Hypot позволяет находить гипотенузу по двум катетам. ее реализация - это не наивное Sqrt(aa + bb) и позволяет избежать переполнения при больших a или b
##
Hypot(3,4).Println;
Hypot(6,5).Println;
Стандартная функция ISqrt
Вычисляет целочисленный квадратный корень из n. Возвращает наибольшее целое число r, такое что r² ≤ n < (r+1)². Если n является точным квадратом, возвращает точный корень.
begin
Println(ISqrt(15),ISqrt(16));
var bi: BigInteger := 6125476524;
bi := bi*bi;
Print(ISqrt(bi),ISqrt(bi-1));
end.
Вывод:
3 4
6125476524 6125476523
Метод массива и списка Swap
Метод массива и списка Swap меняет местами элементы по заданным индексам
begin
var L := Lst(1..10);
// Меняет местами элементы списка
L.Swap(0,9).Swap(1,8).Println;
var a := Arr(1..10);
// Меняет местами элементы массива
a.Swap(0,9).Swap(1,8).Print;
end.
Вывод:
10 9 3 4 5 6 7 8 2 1
10 9 3 4 5 6 7 8 2 1
Стандартная функция Lerp
Функция Lerp возвращает значение на отрезке [a, b] в позиции t ∈ [0, 1].
При t=0 — a, при t=1 — b, при t=0.5 — середина между ними.
var x := Lerp(10, 20, 0.5); // x = 15 (середина между 10 и 20)
var y := Lerp(0, 100, 0.25); // y = 25 (четверть пути от 0 до 100)
var z := Lerp(5, 15, 0.0); // z = 5 (начало отрезка)
Стандартная функция Remap
Функция Remap преобразует x из диапазона [a1,b1] в диапазон [a2,b2] с сохранением относительной позиции.
var a := Remap(0.5, 0, 1, 0, 100); // a = 50 (0.5 → 50%)
var b := Remap(75, 0, 100, 0, 1); // b = 0.75 (75% → 0.75)
var c := Remap(15, 10, 20, 0, 200); // c = 100 (15 посередине между 10 и 20 → 100 посередине между 0 и 200)
Метод Elements для матриц
Метод Elements для матриц является сининимом метода ElementsByRow и превращает матрицу в одномерный массив по строкам:
begin
var m := MatrRandomInteger(3,4,1..10);
m.Println;
m.Elements.Println;
Println(m.Elements.Min,m.Elements.Max,m.Elements.Sum);
end.
Вывод:
10 2 4 5
5 10 5 3
5 4 5 3
10 2 4 5 5 10 5 3 5 4 5 3
2 10 61
Метод None для последовательностей
Метод None для последовательностей возвращает Terue если ни один из элементов последовательности не удовлетворяет условию
begin
var a := Arr(1,2,3,4);
a.None(x -> x > 5).Print
end.
Стандартная функция SetRandomSeed
Стандартная функция SetRandomSeed является синонимом Randomize с более понятным названием и инициализирует датчик псевдослучайных чисел, используя значение seed. При одном и том же seed генерируются одинаковые псевдослучайные последовательности.
begin
loop 10 do
Print(Random(100));
Println;
Println;
SetRandomSeed(122);
loop 10 do
Print(Random(100));
Println;
// Вторая последовательность с тем же самым seed совпадает с первой. Нужно для тестирования
SetRandomSeed(122);
loop 10 do
Print(Random(100));
end.
Вывод:
44 7 94 96 68 97 43 25 7 5
46 61 4 59 28 17 56 64 7 26
46 61 4 59 28 17 56 64 7 26
Новые модули
Новый модуль TurtleABC
Модуль TurtleABC является слабой но всё таки заменой модуля Turtle, но зато может использоваться под Linux
uses TurtleABC;
begin
Mark;
SetScale(4);
SetOrigin(5,-35);
Mark;
SetColor(Color.Blue);
Down;
loop 4 do
begin
Forw(20);
Turn(90);
end;
Up;
MoveTo(-30, 30);
Down;
SetColor(Color.Red);
Mark;
loop 3 do
begin
Forw(15);
Turn(120);
end;
Up;
MoveTo(30, 40);
Down;
SetColor(Color.Green);
Mark;
loop 20 do
begin
Forw(30);
Turn(100);
end;
Up;
MoveTo(-30, 90);
Mark;
Down;
SetColor(Color.Orange);
loop 5 do
begin
Forw(30);
Turn(144);
end;
DrawCoordPoints;
end.
Оптимизация производительности
Ускорен CountOf
Оптимизирован и ускорен метод CountOf для строк