Реализация языка Object Pascal для .NET, ориентированная на обучение современному программированию.
Ключевые особенности PascalABC.NET:
- Различные расширения языка Pascal, включающие оператор foreach, объявление переменных в блоках, автоопределение типа для var переменных, упрощенный синтаксис модулей, возможность определять методы внутри класса или записи, использование оператора new, анонимные классы, автоклассы, большие числа и т.п.
- Наиболее современные особенности языка: n-размерные динамичные массивы, дженерики, интерфейсы, оператор перегрузки, исключения, сборщик муссова, лямбда выражения.
- Эффективная генерация кода для платформы .NET
- Большая совместимость с Delphi Object Pascal.
- Высокая скорость выполнения программ.
- Доступ к большому количеству библиотек .NET.
- Удобная IDE с встроенным отладчиком, генератором кода и автоформатированием.
- Встроенные дизайнер форм для быстрой разработки оконных приложений.
- Простая и эффективная графическая библиотека векторной и растровой графики.
- Директивы OpenMP для параллельного программирования.
Примеры:
Операторы +=, *=
var a: integer := 1;
begin
a += 2;
a *= 2;
end.
Локальные переменные в блоке
begin
var n := 10000;
var s := 0.0;
for var i:=1 to n do
for var j:=1 to n do
s += 1.0/(i*j);
writeln(Milliseconds);
end.
Использование foreach
begin
var arr := new integer[](1,2,3,4);
foreach var x in arr do
write(x,' ');
writeln;
end.
Большие числа
begin
var p: BigInteger := 1;
for var i := 2 to 100 do
p *= i;
writeln('100!=',p);
end.
Короткие функции
function CircleLen(r: real) := 2 * Pi * r;
begin
writeln(CircleLen(2.3));
end.
Создание динамичных массивов используя функцию Arr
begin
var a := Arr(2,5,3,1,9,7);
Sort(a);
writeln(a);
Reverse(a);
writeln(a);
end.
Динамичные матрицы
function Transpose(a: array [,] of integer): array[,] of integer;
begin
var m := Length(a,0);
var n := Length(a,1);
Result := new integer[n,m];
for var i:=0 to n-1 do
for var j:=0 to m-1 do
Result[i,j] := a[j,i]
end;
begin
var a := MatrixRandom(3,4);
writeln(a);
var b := Transpose(a);
writeln(b);
end.
Словари
begin
var Capital := Dict('Russia'=>'Moscow','Germany'=>'Berlin','France'=>'Paris','Italy'=>'Rom');
Println(Capital['France'],Capital['Germany']);
end.
Простые операции с файлами
var
f: Text;
s: string;
begin
Assign(f,'13_Files1.pas');
Reset(f);
while not eof(f) do
begin
readln(f,s);
writeln(s);
end;
Close(f);
end.
begin
var f := OpenRead('13_Files2.pas');
while not f.Eof do
begin
var s := f.ReadlnString;
writeln(s);
end;
f.Close;
end.
begin
foreach var s in ReadLines('13_Files4.pas') do
writeln(s);
end.
Рисование синуса, используя лямбду
uses GraphABC;
begin
Draw(x->x*sin(x));
end.
Метод Монте-Карло
begin
var n := 10000000;
var pp := Range(1,n)
.Select(x->Rec(Random(),Random()))
.Where(p->sqr(p.Item1)+sqr(p.Item2)<1)
.Count/n*4;
Print(pp);
end.
Быстрая сортировка с LINQ
function QuickSort(a: sequence of integer): sequence of integer;
begin
Result := a.Count = 0 ? a : QuickSort(a.Skip(1).Where(x->x<=a.First())) + a.First() + QuickSort(a.Skip(1).Where(x->x>a.First()));
end;
begin
var a := ArrRandom(20);
a.Println;
QuickSort(a).Println;
end.
Полезные ссылки: