PascalABC.NET официальный канал
1.98K subscribers
592 photos
1 video
9 files
400 links
Официальный канал языка и системы программирования PascalABC.NET
Download Telegram
Почему PascalABC.NET лучше C#

Заголовок конечно провокационный. Но действительно - C# при всех огромных ресурсах на его разработку содержит дыры в безопасности.

В теории типов хорошо известен факт: если тип String является подтипом object, то тип "массив string" не должен быть подтипом "массив object"

Язык C# это нарушает. Проблема, которая при этом возникает - на скрине. Программа падает в невинном коде неожиданно в рантайме.

PascalABC.NET отслеживает эту хорошо известную ошибку на этапе компиляции.

#типы
12👍4
Русские исполнители

В PascalABC.NET в примерах используется модуль Исполнители, который позволяет младшим школьникам лучше воспринимать код с объектами, методами и лямбдами.

По-существу, Исполнитель - это объект класса с русскими методами, максимально изолированный от английского интерфейса.

Ключевые слова при этом остаются английскими, что выделяет конструкции PascalABC.NET.
👍61
Что может PascalABC.NET и не может Python

Попробуйте возвести 2 в степень 100000. В PascalABC.NET - легко! А Python падает )
👏12🔥3👍1🤔1🤡1
Рисуем изображения из набора MNIST для распознавания рукописных цифр

Перед вами - небольшая программа для рисования цифр из набора MNIST. Каждая цифра представлена монохромным изображением размера 28 на 28 пикселей.

Размер каждого пиксела при рисовании равен w.

Программа:

uses GraphWPF;

function Reshape(data: array of integer; w,h: integer): array [,] of integer;
begin
if data.Length <> w * h then
raise new Exception('Несоответствие размерности при Reshape()');
Result := MatrByCol(data.Batch(w))
end;

procedure DrawPixels(pixels: array [,] of integer; x: real := 0; y: real := 0; width: real := 10)
:= FastDraw(dc -> begin
for var ix := 0 to pixels.RowCount-1 do
for var iy := 0 to pixels.ColCount-1 do
DrawRectangleDC(dc,x + ix * width, y + iy * width, width, width, GrayColor(pixels[ix,iy]),Colors.Transparent,1);
end);

begin
var sz_img := 28;
var strs: array of string := ReadLines('mnist_test.csv').Skip(1).ToArray;
var data: array of array of integer := strs.Select(s -> s.ToWords(',').Skip(1).Select(x -> x.ToInteger).ToArray).ToArray;
var digits := data.Select(arr -> Reshape(arr,sz_img,sz_img)).ToArray;

var w := 2;
var digits_in_col := 15;
var digits_in_row := 11;
for var iy:=0 to digits_in_row-1 do
for var ix:=0 to digits_in_col-1 do
DrawPixels(digits[iy * digits_in_col + ix],ix*w*sz_img,iy*w*sz_img,w);
end.
🤯71
Использование сериалазации Json с помощью Newtonsoft.Json

Создаем проект, устанавливаем Newtonsoft.Json в качестве NuGet-пакета.

И пишем вот такую программу. Здесь сериализуется в строку в формате json словарь из целых в массивы целых.

Затем происходит десериализация, проверка типа и вывод содержимого в неизменном виде.

Код:
uses Newtonsoft.Json;

begin
var d0 := Dict (1 to [2,3,4],
3 to [4,5,6]
);
var json := JsonConvert.SerializeObject(d0);
Println(json);
var obj := JsonConvert.DeserializeObject&<Dictionary<integer,array of integer>>(json);
Println(TypeName(obj));
var d := obj as Dictionary<integer,array of integer>;
foreach var (k,v) in d do
Println(k,v);
end.


#json #nuget
62🔥1
Обращаемся к LLM из PascalABC.NET

Чтобы сделать запрос к большой языковой модели из PascalABC.NET, воспользуемся сервисом openrouter.ai.

За одну минуту получим там API Token, который будет использован в нашей программе в переменной KEY.

Для работы с JSON создадим проект и двумя нажатиями подключим к нему NuGet-пакет NewtonSoft.Json.

Отправим запрос с вопросом о смысле жизни к одной из самых лучших моделей - deepseek-r1 free с ризонингом (то есть со способностью рассуждать).

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

Попутно в пришедшем json мы видим сам reasoning - рассуждение модели, как отвечать на наш вопрос.

Итак, в чем смысл жизни? Ответ LLM вы видите:

Как писал Виктор Франкл, "Жизнь требует от человека не вопросов, а ответов - через дела и любовь". Так что, возможно, смысл жизни в пути: в том, чтобы задаваться вопросами, искать, расти и находить своё собственное предназначение. 🌱

#PascalABCNET #LLM #любовь #предназначение
👍10🔥6
🎨 Ray Tracing на PascalABC.NET: Красота физики в 300 строках!

В этой демо-сцене PascalABC.NET собраны все классические и современные технологии трассировки лучей. Это не просто картинка, а настоящий учебник компьютерной графики в коде.

Код программы

Что здесь под капотом? 👇

💡 Физика света:
✔️ Закон Снеллиуса (рефракция стекла, кристаллов)
✔️ Рекурсивное отражение и преломление
✔️ Модель освещения Фонга (диффузия + спекулярность)
✔️ Тени от точечных источников
✔️ Градиентное небо

🎨 Рендеринг и материалы:
✔️ Антиалиасинг (3x3 суперсэмплинг)
✔️ Субпиксельные смещения
✔️ Цветное освещение (каждый источник — свой цвет)
✔️ Эмиссивные материалы (свечение объектов)
✔️ Матовые поверхности
✔️ Металлы (золото, зеркала)
✔️ Диэлектрики (стекло, кристаллы)
✔️ Градиентная эмиссия (сильнее в центре)
✔️ Falloff эффекты свечения
✔️ Тон-маппинг (улучшенная обработка ярких цветов)
✔️ Затухание света с расстоянием
✔️ Улучшенное смешивание цветов от разных источников

⚙️ Технологии:
✔️ Параллельные вычисления (OpenMP)
✔️ Оптимизация производительности
✔️ Перегрузка операций в классах

💡 Почему PascalABC.NET?
📍 Быстро, наглядно, красиво.
📍 Читаемый код.
📍 Всё работает прямо в IDE.
📍 Идеально для изучения физики света, трассировки лучей, алгоритмов визуализации.

🎥 Сцена рендерится за секунды.
👨‍💻 Всего ~300 строк кода.
PascalABC.NET легко учит сложным вещам!
👍11🔥72
Черепаха меняет цвет

Черепаха теперь запоминает изменение цвета

uses Turtle,GraphWPF;

begin
SetWidth(5);
ToPoint(-10,0);
loop 70 do
begin
SetColor(RandomColor);
Down;
Forw(5);
Up;
Back(5);
TurnRight(90);
Forw(0.3);
TurnLeft(90);
end;
end.
🔥123
Rosetta Code - Abbreviations, easy

Решение еще одной задачи из Rosetta Code
https://rosettacode.org/wiki/Abbreviations,_easy#PascalABC.NET

Здесь - использование многострочных строк, создание словаря с помощью Each, использование FirstOrDefault, а также операций ?. и ??

А PascalABC.NET - на 57 месте в рейтинге с 616 решениями!
👍9
Rosetta Code - Abbreviations, simple

Продолжаем решать задачи из Rosetta Code.
На этот раз подключаем ИИ DeepSeek
https://rosettacode.org/wiki/Abbreviations,_simple#PascalABC.NET

ИИ некоторые вещи не знает - приходится ему рассказывать, что есть
{$zerobasedstrings on}
Dict('' to '')


и прочие плюшки.

В целом - слушается :) И генерирует работоспособный алгоритм
11
🚀 Метод Each в PascalABC.NET: создание словарей из последовательностей

В PascalABC.NET метод Each позволяет быстро преобразовать последовательность в словарь, где ключами являются элементы исходной последовательности, а значениями — результат применения функции к каждому ключу. Это удобно для создания ассоциативных структур без лишнего кода.

Пример группировки слов по длине из строки:

var text := 'Do not count your chickens before they hatch';
var words := text.ToWords;
var dict := words.Select(w -> w.Length)
.Distinct
.Order
.Each(len -> words.Where(w -> w.Length = len));
dict.PrintLines;


Здесь:
ключ — длина слова
значение — последовательность слов с этой длиной
53
Модуль Graph3D - дым из труб

В Graph3D появилась возможность создавать анимацию типа "дым из труб" с помощью нового 3D-объекта ParticleSystem.

uses Graph3D;

begin
View3D.BackgroundColor := Colors.Black;
Cylinder(0,0,0,2,0.5);
var ps := ParticleSystem(0,0,0,'smoke.png');
// ps.TextureName := 'smoke.png';
ps.LifeTime := 5;
ps.FadeOutTime := 0;
ps.VelocityDamping := 0.999;
ps.AngularVelocity := 10;
ps.SizeRate := 1;
ps.AccelerationDirection := V3D(3,0,-1);
ps.Acceleration := 4;
ps.AccelerationSpreading := 10;
ps.EmitRate := 100;
ps.StartRadius := 0;
ps.StartSize := 0.5;
ps.StartDirection := V3D(0,0,1);
ps.StartSpreading := 10;
ps.StartVelocity := 4;
ps.StartVelocityRandomness := 2;
ps.Position := P3D(0, 0, 0);
end.
👍10🔥81
Развевающийся флаг в Graph3D

В Graph3D появился анимированный графический примитив Cloth, который позволяет создать полотнище ткани - например, флаг, - развевающийся на ветру.

Анимацию можно остановить и продолжить заново

uses Graph3D;

begin
Window.Caption := 'Развевающийся флаг';
View3D.HideAll;
Cylinder(0,4,0,6,0.07,Colors.Brown);
var c := Cloth(0,4,0,3,4,6,'FlagOfRussia.png');
c.WindSpeed := 6;
c.WindDirection := 180;
c.Gravity := 4;
c.Damping := 0.999;
c.Mass := 0.8;
c.Iterations := 20;
Sleep(1000);
c.Stop;
Sleep(1000);
c.Start;
end.
🔥13🍾42
Версия PascalABC.NET 3.11

Поздравляем всех читателей канала с Днем знаний!

Вышла версия PascalABC.NET 3.11 со встроенной поддержкой многозыковости (разработчик Земляк Александр). Для примера в среду встроен компилятор языка SPython (разработчик Мовчан Егор).

Ниже - программа на SPython, сохраненная в файле с расширением .pys:

def product(a: list[int], **kwargs: int) -> list[list[int]]:
repeat = kwargs['repeat']
if repeat == 1:
return [[a[i]] for i in range(len(a))]
prev = product(a, repeat = repeat - 1)
res: list[list[int]] = []
for elem in a:
for p in prev:
res.append([elem] + p)
return res

print(product([1,2,3], repeat = 3));


Вывод:

[[1,1,1],[1,1,2],[1,1,3],[1,2,1],[1,2,2],[1,2,3],[1,3,1],[1,3,2],[1,3,3],[2,1,1],[2,1,2],[2,1,3],[2,2,1],[2,2,2],[2,2,3],[2,3,1],[2,3,2],[2,3,3],[3,1,1],[3,1,2],[3,1,3],[3,2,1],[3,2,2],[3,2,3],[3,3,1],[3,3,2],[3,3,3]]


SPython - язык с синтаксисом Питона, имеющий статическую типизацию и скорость выполнения, равную скорости программ PascalABC.NET и C#.

В примере программы на SPython - определение функции, рекурсия, параметры **, списки, методы списков, именованные аргументы, словари и обязательные спецификации типов при определении функции
🔥135
PascalABC.NET в английской википедии

PascalABC.NET упомянут в английской википедии в престижной статье о Linux как одна из свободных реализаций языка программирования Pascal
https://en.wikipedia.org/wiki/Linux
в подрубрике "Programming on Linux"
👏21🔥41
Как выглядят анонимные функции в разных языках ?

По-разному. 🤔

🦀 Rust:
| x: i32, y: i32 | x + y

💎 Ruby:
lambda { |x, y| x + y }

🌙 Lua:
function(x,y) return x+y end

⚙️ C++:
[](auto x, auto y) {return x + y;};

🐍 Python:
lambda х, у: х+у

И только в PascalABC.NET, Maple и Java:
(x, y) -> x + y

А что выберете вы? 😉
9
Использование emoji в комментариях PascalABC.NET

// 🫡 — работает - и ладно
// 🤯 — баг неожиданно проявился
// 🤖 — спросил у ChatGPT, а оно работает
// 🔥 — особенно крутой кусок кода
// 💀 — опасный, но рабочий хардкор
// 🐢 — работает медленно, но верно
// 🪄 — магия, хитрое решение
// 🧠 — очень умный алгоритм
// 💩 — плохой код, но работает
// ⚡️ — оптимизация, ускорение
// 🕵️‍ — исследуем баг
// 🎯 — правильно решённая задача
// 🌀 — хаотичный участок кода
// 🛠 — починю потом (нет)
// 📚 — списал у учебника
// 🥷 — скрытый трюк или пасхалка
// 🎉 — оно заработалоооо!
// — красиво, блин
// 💾 — память используется эффективно
// 👽 — пришельцы помогали писать этот фрагмент
😎23👍41
Машинное обучение на PascalABC.NET.
Метод
k ближайших соседей

Возвращаемся к публикации классических методов ИИ. Решаем с помощью модуля MLABC одну из известнейших задач ML. Суммарно - около 250 строк кода.
Используются лямбды, цепочки методов, LINQ, классы, исключения, срезы массивов. Класс Dataset реализован в виде массива массивов вещественных - для простоты реализации. Код основной программы по интерфейсу максимально приближен к интерфейсу модуля Python scikit-learn.

Метод k ближайших соседей (kNN) — это один из простейших алгоритмов машинного обучения, который используется для задач классификации и регрессии. В его основе лежит принцип, что объект относится к тому классу, которому принадлежит большинство из k ближайших к нему соседей в пространстве признаков.

В качестве примера мы использовали стандартный набор данных об ирисах Фишера, содержащий три класса (виды ирисов), сбалансированные по количеству объектов. Данные были разделены на обучающую и тестовую выборки, после чего модель kNN с параметром k = 3 была обучена и протестирована.

Здесь для данного цветка ириса надо предсказать его принадлежность к одному из трех классов.

Метод показал высокую точность на тестовых данных — порядка 96%, что подтверждает его эффективность для этой задачи. Такой алгоритм можно применять для различных задач классификации в машинном обучении, включая распознавание изображений, анализ текстов и медицинскую диагностику.

Он легко понимается первокурсниками!

В комментарии - исходники
👍321🤩1
Погрешность при вычислениях с вещественными

Вычисления с вещественными значениями производятся не точно, а приближенно. Поэтому результат может оказаться неожиданным.

На скрине - пример одного из таких результатов.

А должно быть ведь ровно 10 - да? Или нет?
👍5
Особые значения вещественного типа

Среди особых значений вещественного типа различают Бесконечность (положительную и отрицательную) и значение NaN - Not a Number (не число), которое возникает при некоторых некорректных операциях - например, при извлечении корня из отрицательного числа

##
// +∞: результат деления на 0 или константа PositiveInfinity
var posInf := real.PositiveInfinity;
var posInf2 := 1.0/0.0;
Println($'+∞: {posInf} Проверка: {real.IsPositiveInfinity(posInf)}');
Println($'1/0 → {posInf2}');

// -∞: отрицательное деление на 0 или константа NegativeInfinity
var negInf := real.NegativeInfinity;
var negInf2 := -1.0/0.0;
Println($'-∞: {negInf} Проверка: {real.IsNegativeInfinity(negInf)}');
Println($'-1/0 → {negInf2}');

// NaN: «не число» – результат недопустимых операций
var nanVal := real.NaN;
var nanVal2 := Sqrt(-1);
Println($'NaN: {nanVal} Проверка: {real.IsNaN(nanVal)}');
Println($'Sqrt(-1) → {nanVal2}');
👍112