PascalABC.NET официальный канал
1.8K subscribers
495 photos
1 video
9 files
346 links
Официальный канал языка и системы программирования PascalABC.NET
Download Telegram
Многострочные строковые литералы '''

В PascalABC.NET появились Multiline строковые литералы, которые недавно появились в таких языках как C# 11, Delphi 12, Java 22.

Строки с открывающими и закрывающими кавычками не должны содержать непробельных символов.

Во всех строках игнорируется отступ, равный отступу последней строки.

#новое
Модуль WPF - парсинг оконных элементов из XAML-строки

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

Чтобы затем воспользоваться дочерними элементами в программе, необходимо сопоставить их переменным и затем привязать обработчики.

На скриншоте - программа, иллюстрирующая создание StackPanel с двумя оконными элементами, сопоставление дочерним элементам переменных программы и затем привязка обработчика, меняющего текст в TextBlockе в зависимости от текста в TextBox.

#новое
Новый метод строк ToLines

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

Это удобно также при считывании файла как отдельной строки:

ReadAllText('a.txt').ToLines

#новое
Оптимизировано множественное присваивание

Закончена работа по оптимизации множественного присваивания. Один из результатов можно видеть на скриншоте: данная программа ускорена примерно в 2 раза.

Нетрудно проверить, что аналогичная программа, написанная на C#, работает в 2 раза медленнее.

Это - основной результат выпускной работы бакалавра направления ФИИТ мехмата ЮФУ Филонова Александра: https://pascalabc.net/downloads/Diploms/Opt_Tuple_Assignment_Filonov.pdf

#новое
Изменения, связанные со словарями

Готовимся к версии 3.10.

Из Kotlinа перекочевал ряд методов, конструкций и операций со словарями.

begin
// Новая операция 1 to 2 - синоним KV(1,2)
var d := Dict('cat' to 'кошка', 'dog' to 'собака');
// Новая функция Pair - синоним KV
var d0 := Dict(Pair('cat', 'кот'), Pair('camel', 'верблюд'));
// Более сложная структура
var dd := Dict('Иванов' to |5, 3, 3|, 'Петров' to |4, 4|);
// Копия словаря
var d1 := Dict(d);
// Инициализация массивами ключей и значений
var d2 := Dict(|11, 22|, |333, 444|);
// Обновление значений и добавление новых
d.Update(d0);
// То же
d += d0;
// Слияние словарей
var d3 := d + Dict('world' to 'мир', 'cloud' to 'облако');
Println(d3);
// Вычитание пар с данными ключами
d3 -= Seq('cat', 'camel');
Println(d3);
d3 := d3 - 'world';
Println(d3);
end.

Вывод:
{(cat,кот),(dog,собака),(camel,верблюд),(world,мир),(cloud,облако)}
{(dog,собака),(world,мир),(cloud,облако)}
{(dog,собака),(cloud,облако)}


#новое
Внешние функции Zip и Cartesian

В стандартной библиотеке реализованы внешние функции Zip и Cartesian с количеством последовательностей от 2 до 5 и необязательной функцией проекции

#новое
Обновлённый модуль Turtle

Обновлён школьный модуль Turtle для Исполнителя Черепаха.

uses Turtle;

begin
SetWidth(1.4);
SetColor(Colors.Blue);
//ToPoint(3,0);
Down;
loop 4000 do
begin
//Circle(0.1);
Forw(0.3);
Turn(Random(-120,120));
//Sleep(1);
end;
end.


Для знакомства с возможностями можно скачать новую версию и запустить указанную программу.

Обязательно понажимайте Пробел - меняется отображение координат.

Если программа будет тормозить при перерисовке, уменьшите количество итераций в цикле.

Принимаются предложения и сообщения о багах.

#новое
Функция SetOf

В PascalABC.NET появилась функция SetOf для создания множества.

Она возвращает множество HashSet, но это может измениться.

Функция SetOf введена для обучения начинающих.

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

#новое
Преобразование в вещественное, имеющее другой разделитель целой и дробной части

Реализован ряд дополнительных параметров для преобразования строк в вещественные с другим разделителем целой и дробной части

Можно также вызвать глобальную процедуру SetDecimalSeparator(','), которая будет влиять на все последующие преобразования

#новое
Визуализация массива точек в Turtle

В модуле Turtle появилась функция визуализации массива точек DrawPoints. В качестве параметров можно передавать либо массив точек, либо массивы абсцисс и ординат точек.

Вот программа, визуализирующая первый тестовый набор точек с двумя кластерами. На скриншоте видно, что к сожалению границы кластера не целочисленные.

uses Turtle;

begin
Window.Title := 'Кластеризация';
var a := ReadLines('demo_2025_27_А.txt').Skip(1).JoinToString.ToReals(',').ToArray;
var xx := a[::2];
var yy := a[1::2];
DrawPoints(xx,yy);
end.


#новое
#ЕГЭ
Библиотека MathNet.Numerics.dll

Библиотека математических вычислений MathNet.Numerics.dll интегрирована в инсталлятор PascalABC.NET.

На скриншоте - генерация набора чисел, подчиненного нормальному распределению

#новое
Автоклассы и их предки

В PascalABC.NET стало возможно наследовать автоклассы от классов без полей. Это можно использовать в ряде сценариев.

#новое
Новый модуль Coords

Модуль Coords предназначен для отображения графических элементов с масштабированием. Он позволяет отображать различные графические примитивы без анимации - при масштабировании мышью все примитивы заново "проигрываются" с новым масштабом.

Необходимо скачать новую версию.

uses Coords;

function RandomPoint: Point := Pnt(Random(-13,13),Random(-10,10));

begin
DrawPoints(ArrGen(10,i -> RandomPoint),PointRadius := 4);
DrawPoints(ArrGen(10,i -> RandomPoint),PointRadius := 6);
DrawPoint(2,3,Colors.Red);
DrawCircle(1,1,1,Colors.LightBlue);
DrawRectangle(3,2,2,1);
DrawText(3,2,'Hello');
DrawTextUnscaled(0,0,'Текст не масштабируется', Size := 20, Color := Colors.Red);
DrawText(-4,7,'Текст масштабируется', FontName := 'Courier New', Size := 34);
end.


На основе модуля Coords написан модуль Turtle.

#новое
🆕 Новый метод Window.SaveToClipboard

В GraphWPF появился метод Window.SaveToClipboard сохранения содержимого окна в буфер обмена.

Теперь можно легко сохранять содержимое окна прямо в буфер обмена всего одной строкой кода! Это отличное решение для быстрого обмена информацией, создания скриншотов или копирования данных для дальнейшего использования.

🔧 Пример использования:

uses GraphWPF;

begin
Circle(200,200,100,Colors.LightBlue);
Window.SaveToClipboard;
end.


Что это дает?
✦ Удобство в разработке: быстрое сохранение визуальных данных.
✦ Интеграция с другими приложениями: копируйте данные напрямую и вставляйте в любые другие программы.
✦ Экономия времени: больше не нужно использовать сторонние инструменты для захвата экранов.

Пробуйте новый метод и делитесь своими впечатлениями! 🚀

#новое
Новые множества

В PascalABC.NET обновлена реализация встроенных множеств set of T, просуществовавшая 17 лет. За это время в PascalABC.NET внесено огромное количество улучшений: появились обобщенные классы, перегрузка операций, методы расширения, реализация интерфейсов, последовательности. Именно благодаря этим средствам реализация новых множеств стала возможной.

В результате новые множества значительно ускорены, приближаясь по эффективности к HashSet<T>.

На скриншоте - программа, которая работает в старой версии примерно в 1000 медленнее.

Обновите Паскаль - скачайте новую версию!

#PascalABC #новое

begin
var s: set of integer;
var n := 10000000;
for var i:=1 to n do
s += [i];
Print(MillisecondsDelta);
end.
Нововведения в модуде Coords

В модуле Coords появились функции Distance, Middle и многое другое.

uses Coords;

begin
Globals.PointRadius := 2.3;
Globals.LineWidth := 1.0;
var p1 := Pnt(2,3);
var p2 := Pnt(-4,7.3);
var p3 := Pnt(-5,-3);
DrawPoint(p1);
DrawPoint(p2);
DrawPoint(p3);
DrawText(p1,'A', Align := Alignment.LeftBottom, Size := 18);
DrawText(p2,'B', Align := Alignment.LeftBottom, Size := 18);
DrawText(p3,'C', Align := Alignment.RightTop, Size := 18);
DrawLine(p1,p2);
DrawLine(p1,p3);
DrawLine(p2,p3);
DrawText(Middle(p1,p2), p1.Distance(p2).ToString(2), Align := Alignment.Center, BackgroundColor := Colors.LightBlue);
DrawText(Middle(p2,p3), p2.Distance(p3).ToString(2), Align := Alignment.Center,
BackgroundColor := Colors.White, BorderWidth := 0.5);
DrawText(Middle(p1,p3), p1.Distance(p3).ToString(2), Align := Alignment.Center, BackgroundColor := Colors.LightGreen);
end.


Скачайте новую версию!

#новое
Множества в PascalABC.NET уже никогда не будут прежними

Начиная с версии 3.10.2 выражения вида [1,2,3] в PascalABC.NET трактуется по умолчанию как массив.

Данное поведение реализовано в последних версиях Delphi, что абсолютно правильно: использовать распространенную запись [1,2,3] для редко используемых встроенных множеств - расточительство!

Встроенные множества в PascalABC.NET остаются, но для их использования следует использовать переменные с явным объявлением типа. Таким образом, весь код на старом Паскале будет работать.

На скриншоте показано, в каких ситуациях запись в [...] трактуется как массив, а в каких - как множество.

Старый синтаксис литеральных массивов |1,2,3| сохранится, но объявляется устаревшим.

#новое
Learn PascalABC.NET in Y minutes

На вики-странице Learn PascalABC.NET in Y minutes впервые представлены все ключевые возможности PascalABC.NET, отражающие 17 лет его эволюции.

📌 Важнейшие разделы:

🔹 Структуры данных: кортежи, диапазоны, строки, массивы, списки, словари, множества, записи и классы.
🔹 Современные языковые средства: автовыведение типа, внутриблочные описания, циклы loop и foreach, цикл for с шагом, интерполяция строк, многострочные строки, параметры по умолчанию и именованные аргументы.
🔹 Современные операции: in, срезы, индексация с конца. to для создания пар "ключ-значение" — лаконичные инструменты для работы с данными.
🔹 Новые литеральные массивы [1,2,3].
🔹 Лямбда-выражения и функциональные переменные: гибкость функционального подхода.
🔹 Последовательности: мощный инструмент для работы с данными, включая LINQ.
🔹 Поддержка разных парадигм: процедурное, функциональное, обобщенное и объектно-ориентированное программирование.
🔹 Полная интеграция со стандартной библиотекой .NET.

📖 Этот документ — уникальное собрание возможностей, отражающих эволюцию и современность PascalABC.NET.

🎖 Специальная благодарность @ulysses4ever за идею создания данного документа.

#PascalABCNET #новое
faststring - новый тип в PascalABC.NET 3.10.3

На самом деле faststring - это просто синоним StringBuilder с немного дополненной функциональностью (методами Replace и IndexOf и операцией in)

Однако faststring работает действительно быстро: в примере на скрине, предложенном @tpehep33, метод PascalABC.NET опережает аналогичную функцию Python, написанную на C++, в 2 раза.

// 6.0 sec PascalABC.NET vs 11.4 sec Python
begin
var mx := 0;
for var n := 4 to 9999 do
begin
var s: faststring := '4' + '1' * n;

while ('411' in s) or ('1111' in s) do
s.Replace('411', '14', 1)
.Replace('1111', '1', 1);

mx := max(mx, s.ToString.Sum(d -> d.todigit));
end;
print(mx, Milliseconds / 1000);
end.


#новое
Инициализатор пустой коллекции []

В 3.10.3 появился инициализатор [] любой коллекции. Он заменяет собой вызов конструктора по умолчанию.

Особенно удобно использовать [] для передачи в качестве параметра - тип формального параметра уже указан при описании, а при вызове в параметрах мы всего лишь указываем [].

procedure ppp(s: sequence of integer; a: array of integer; lst: List<(real,real)>;
d: Dictionary<string,integer>; hs: HashSet<integer>; ss: SortedSet<integer>);
begin end;

begin
var old: set of integer := [];
var s: sequence of integer := [];
var a: array of integer := [];
var lst: List<(real,real)> := [];
var d: Dictionary<string,integer> := [];
var st: Stack<string> := [];
var q: Queue<string> := [];
var hs: HashSet<integer> := [];
var ss: SortedSet<integer> := [];

ppp([],[],[],[],[],[]);

var aa: array of array of integer := [[1],[],[2,3]];
end.


#новое