PascalABC.NET официальный канал
1.92K subscribers
516 photos
1 video
9 files
364 links
Официальный канал языка и системы программирования PascalABC.NET
Download Telegram
Пишем интерпретатор на PascalABC.NET. Визиторы по синтаксическому дереву

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

https://teletype.in/@pascalabcnet/Visitors
PascalABC.NET в Astra Linux

На портале https://easyastra.ru/TEST/ опубликован deb-пакет для PascalABC.NET.
Литеральный массив

Литеральный массив может содержать различные числовые типы - в качестве типов элементов массива выбирается наиболее общий числовой тип.

На скриншоте - литеральный массив, заданный целыми и вещественными
True или False?

Бывает и такое. Интересно, почему?
Греческие буквы в именах

Имена в PascalABC.NET могут быть буквами любого алфавита
Как не надо вычислять максимум

Очень часто можно встретить в ЕГЭшных задачах такой код вычисления максимума. Он абсолютно неэффективен. Но пишется чтобы сэкономить несколько символов.

Он пришел на волне тотальной популярности языка Питон, на котором массово пишут короткий неэффективный код. Эти привычки потом остаются на всю жизнь.

На Питоне кстати ввиду его неэффективности скорость программы с условным оператором и функцией Max одинакова.
Выделение содержимого всех строковых констант в файле

Пользуемся регулярными выражениями.

Для апострофа пользуемся ESC-последовательностью \'. Поскольку это апостроф как символ внутри строковой константы, то повторяем его дважды \''

Поскольку нам не нужны сами апострофы, а только их содержимое, пользуемся утверждениями положительного просмотра назад и вперед соответственно.
Публикация о новой версии на opennet.ru

Новостной ИТ-сайт opennet.ru опубликовал сообщение о выходе версии PascalABC.NET 3.9.0:
https://www.opennet.ru/opennews/art.shtml?num=59497

К сожалению, именованные аргументы названы именованными атрибутами, а основное изменение в языке - поддержка ковариантных параметров обобщений - упомянута через запятую вскользь в последнем пункте. Жаль также, что не упомянута поддержка библиотеки машинного обучения Microsoft.ML.

Сайт OpenNet.ru известен своей смелостью - он продолжает публиковать новости о выходе новых версий PascalABC.NET несмотря на резко негативный тон комментариев своих читателей. Обсуждения здесь прекрасны, иногда попадаются настоящие жемчужины (см. скриншот).
Как быстро нарисовать 100000 окружностей

Используем FastDraw и рисование на DrawingContext

#графика
Решение задач под управлением модуля невидимой проверки

Хотите попробовать, как решать задачи под управлением модуля невидимой автоматической проверки? Попробуйте прямо сейчас!

Для этого скачайте последнюю версию PascalABC.NET, откройте Примеры\CheckedTasks\LightPT\УрокМассивы. Выберите любую задачу и попробуйте решить!

Делитесь впечатлениями в комментариях!
Новые стандартные функции ArrRandomReal и SeqRandomReal с параметром digits

В последней версии появились стандартные функции ArrRandomReal и SeqRandomReal с необязательным параметром digits.

Спасибо Александру Осипову за предложение!

#новое
Гауссово (нормальное) распределение случайной величины

Данная программа иллюстрирует гауссово распределение случайной величины
pascal
uses GraphWPF;

function Gauss(M,Sigma: real): real;
begin
var u := Random;
var v := Random;

var sq1 := Sqrt(-2*ln(v))*Cos(2*Pi*u);
Result := Sigma * sq1 + M
end;

begin
Window.Title := 'Нормально распределенная случайная величина';
SetMathematiccoords(-5,5);
loop 100000 do
begin
var (x,y) := (Gauss(0,1),Gauss(0,1));
FillCircle(x,y,0.02,RandomColor)
end
end.
Метод Numerate

Метод Numerate позволяет к каждому элементу последовательности приписать его номер в последовательности. Он возвращает последовательность пар (номер, элемент)

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

Например, в задаче "Номера первых пяти простых чисел, содержащих цифру 5" решение может быть таким:

##
uses School;
Primes(500).Numerate.Where(p -> '5' in p[1].ToString).Take(5).Print

с выводом
(3,5) (16,53) (17,59) (36,151) (37,157)

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

uses School;

begin
var pp := Primes(500);
for var i:=0 to pp.Count-1 do
if '5' in pp[i].ToString then
Println(pp[i],i+1)
end.

Вывод:
5 3 
53 16
59 17
151 36
157 37
251 54
257 55
353 71
359 72
457 88

И - надо отобрать первые 5 строк. Кто предложит - как, не используя последовательности?
Обзор роликов на youtube. Молодые старики

За последний месяц на youtube появилось не так много появилось статей с тегом PascalABC.NET.

Вот одна характерная: https://www.youtube.com/watch?v=tF6H2zQx1ts

Порекламируем канал молодого репетитора :)

Но что мы видим? Показ программы вычисления дискриминанта в среде PascalABC.NET на дремучем Паскале 70-х годов. Ни тебе автовывода типов, ни тебе внутриблочных описаний. Даже кортежей - и тех нет!

И - вывод - на скриншоте о том, что язык Паскаль - для людей за 40+.

Вывод. Полностью отсутствует попытка разобраться, что такое PascalABC.NET.
Shuffle - перемешиваем колоду карт

Данная программа иллюстрирует создание и перемешивание колоды карт. Для создания используется метод Cartesian, для перемешивания - внешняя функция Shuffle, которая пришла из стандартной библиотеки C++.
Перемешиваем карты - Unicode-символы

begin
var bb := Encoding.Unicode.GetBytes('🂡');
var Cards := LstStr;
for var i := 0 to 4*16-1 do
begin
var s := Encoding.Unicode.GetString(bb);
if i mod 16 not in |11,14,15| then
Cards += s;
bb[2] += 1;
end;
Cards.Println;
Println;
Shuffle(Cards);
Cards.Println;
end.


В данной программе будем представлять игральные карты Unicode-символами. Основная сложность здесь - то, что игральная карта кодируется двумя Unicode-символами. Поэтому преобразуем ее вначале в последовательность байт, затем будем увеличивать нужный байт на 1 и назад потом преобразуем в строку.

Из полученной последовательности выбросим некоторые Unicode-символы, не являющиеся изображениями карт.

И потом перетасуем нашу колоду, вызвав процедуру Shuffle для списка!
ToArray для кортежей

В выпуске 3.9.0.3338 появился метод расширения ToArray для кортежей элементов одного типа

#новое
Вырезание подматрицы из матрицы

Срезы позволяют вырезать подматрицу из матрицы
SelectMany как операция, обратная группировке

Если произвести группировку по какому-то полю, то мы получим иерархический набор данных, разбитых по группам.

Чтобы вернуться назад к линейным данным - используем SelectMany. Этот метод сцепляет последовательности из каждой группы в единую плоскую последовательность.

В результате после GroupBy и SelectMany получаем исходную последовательность с измененным порядком элементов.