Пишем интерпретатор на PascalABC.NET. Визиторы по синтаксическому дереву
В данной статье мы рассматриваем важный для создания интерпретаторов и достаточно сложный паттерн проектирования Визитор, применяем его к нашему синтаксическому дереву и реализуем конкретный визитор для упрощенного вывода текста программы, занимающий около 20 строк.
https://teletype.in/@pascalabcnet/Visitors
В данной статье мы рассматриваем важный для создания интерпретаторов и достаточно сложный паттерн проектирования Визитор, применяем его к нашему синтаксическому дереву и реализуем конкретный визитор для упрощенного вывода текста программы, занимающий около 20 строк.
https://teletype.in/@pascalabcnet/Visitors
Teletype
Пишем интерпретатор на PascalABC.NET. Визиторы по синтаксическому дереву
fsgdhj
PascalABC.NET в Astra Linux
На портале https://easyastra.ru/TEST/ опубликован deb-пакет для PascalABC.NET.
На портале https://easyastra.ru/TEST/ опубликован deb-пакет для PascalABC.NET.
Как не надо вычислять максимум
Очень часто можно встретить в ЕГЭшных задачах такой код вычисления максимума. Он абсолютно неэффективен. Но пишется чтобы сэкономить несколько символов.
Он пришел на волне тотальной популярности языка Питон, на котором массово пишут короткий неэффективный код. Эти привычки потом остаются на всю жизнь.
На Питоне кстати ввиду его неэффективности скорость программы с условным оператором и функцией Max одинакова.
Очень часто можно встретить в ЕГЭшных задачах такой код вычисления максимума. Он абсолютно неэффективен. Но пишется чтобы сэкономить несколько символов.
Он пришел на волне тотальной популярности языка Питон, на котором массово пишут короткий неэффективный код. Эти привычки потом остаются на всю жизнь.
На Питоне кстати ввиду его неэффективности скорость программы с условным оператором и функцией Max одинакова.
Выделение содержимого всех строковых констант в файле
Пользуемся регулярными выражениями.
Для апострофа пользуемся ESC-последовательностью \'. Поскольку это апостроф как символ внутри строковой константы, то повторяем его дважды \''
Поскольку нам не нужны сами апострофы, а только их содержимое, пользуемся утверждениями положительного просмотра назад и вперед соответственно.
Пользуемся регулярными выражениями.
Для апострофа пользуемся 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 несмотря на резко негативный тон комментариев своих читателей. Обсуждения здесь прекрасны, иногда попадаются настоящие жемчужины (см. скриншот).
Новостной ИТ-сайт opennet.ru опубликовал сообщение о выходе версии PascalABC.NET 3.9.0:
https://www.opennet.ru/opennews/art.shtml?num=59497
К сожалению, именованные аргументы названы именованными атрибутами, а основное изменение в языке - поддержка ковариантных параметров обобщений - упомянута через запятую вскользь в последнем пункте. Жаль также, что не упомянута поддержка библиотеки машинного обучения Microsoft.ML.
Сайт OpenNet.ru известен своей смелостью - он продолжает публиковать новости о выходе новых версий PascalABC.NET несмотря на резко негативный тон комментариев своих читателей. Обсуждения здесь прекрасны, иногда попадаются настоящие жемчужины (см. скриншот).
Решение задач под управлением модуля невидимой проверки
Хотите попробовать, как решать задачи под управлением модуля невидимой автоматической проверки? Попробуйте прямо сейчас!
Для этого скачайте последнюю версию PascalABC.NET, откройте Примеры\CheckedTasks\LightPT\УрокМассивы. Выберите любую задачу и попробуйте решить!
Делитесь впечатлениями в комментариях!
Хотите попробовать, как решать задачи под управлением модуля невидимой автоматической проверки? Попробуйте прямо сейчас!
Для этого скачайте последнюю версию PascalABC.NET, откройте Примеры\CheckedTasks\LightPT\УрокМассивы. Выберите любую задачу и попробуйте решить!
Делитесь впечатлениями в комментариях!
Новые стандартные функции ArrRandomReal и SeqRandomReal с параметром digits
В последней версии появились стандартные функции 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.
EasyAstra - Astra Linux становится ближе. В статье, помимо прочего, рассказывается, как быстро установить deb-пакет PascalABC.NET из репозитория Астра Линукс.
https://interface31.ru/tech_it/2023/08/easyastra-astra-linux-stanovitsya-blizhe.html
https://interface31.ru/tech_it/2023/08/easyastra-astra-linux-stanovitsya-blizhe.html
Записки IT специалиста
EasyAstra - Astra Linux становится ближе
Astra Linux занимает ведущее место среди предназначенных для импортозамещения дистрибутивов и так получается, что ее пользователями становятся не только те, кому действительно нужна повышенная безопасность и мандатная система доступа, но и простые пользователи…
Метод Numerate
Метод Numerate позволяет к каждому элементу последовательности приписать его номер в последовательности. Он возвращает последовательность пар (номер, элемент)
Этот метод очень удобен в задачах, где требуется использовать именно номера элементов.
Например, в задаче "Номера первых пяти простых чисел, содержащих цифру 5" решение может быть таким:
Метод 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И - надо отобрать первые 5 строк. Кто предложит - как, не используя последовательности?
53 16
59 17
151 36
157 37
251 54
257 55
353 71
359 72
457 88
Обзор роликов на youtube. Молодые старики
За последний месяц на youtube появилось не так много появилось статей с тегом PascalABC.NET.
Вот одна характерная: https://www.youtube.com/watch?v=tF6H2zQx1ts
Порекламируем канал молодого репетитора :)
Но что мы видим? Показ программы вычисления дискриминанта в среде PascalABC.NET на дремучем Паскале 70-х годов. Ни тебе автовывода типов, ни тебе внутриблочных описаний. Даже кортежей - и тех нет!
И - вывод - на скриншоте о том, что язык Паскаль - для людей за 40+.
Вывод. Полностью отсутствует попытка разобраться, что такое PascalABC.NET.
За последний месяц на youtube появилось не так много появилось статей с тегом PascalABC.NET.
Вот одна характерная: https://www.youtube.com/watch?v=tF6H2zQx1ts
Порекламируем канал молодого репетитора :)
Но что мы видим? Показ программы вычисления дискриминанта в среде PascalABC.NET на дремучем Паскале 70-х годов. Ни тебе автовывода типов, ни тебе внутриблочных описаний. Даже кортежей - и тех нет!
И - вывод - на скриншоте о том, что язык Паскаль - для людей за 40+.
Вывод. Полностью отсутствует попытка разобраться, что такое PascalABC.NET.
Перемешиваем карты - Unicode-символы
В данной программе будем представлять игральные карты Unicode-символами. Основная сложность здесь - то, что игральная карта кодируется двумя Unicode-символами. Поэтому преобразуем ее вначале в последовательность байт, затем будем увеличивать нужный байт на 1 и назад потом преобразуем в строку.
Из полученной последовательности выбросим некоторые Unicode-символы, не являющиеся изображениями карт.
И потом перетасуем нашу колоду, вызвав процедуру Shuffle для списка!
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 для кортежей элементов одного типа
#новое
В выпуске 3.9.0.3338 появился метод расширения ToArray для кортежей элементов одного типа
#новое
SelectMany как операция, обратная группировке
Если произвести группировку по какому-то полю, то мы получим иерархический набор данных, разбитых по группам.
Чтобы вернуться назад к линейным данным - используем SelectMany. Этот метод сцепляет последовательности из каждой группы в единую плоскую последовательность.
В результате после GroupBy и SelectMany получаем исходную последовательность с измененным порядком элементов.
Если произвести группировку по какому-то полю, то мы получим иерархический набор данных, разбитых по группам.
Чтобы вернуться назад к линейным данным - используем SelectMany. Этот метод сцепляет последовательности из каждой группы в единую плоскую последовательность.
В результате после GroupBy и SelectMany получаем исходную последовательность с измененным порядком элементов.