This commit is contained in:
Ivan Bondarev 2024-03-29 12:19:02 +01:00
parent 7d61b271c8
commit a07d7bb8e5
4 changed files with 89 additions and 11 deletions

View file

@ -5881,6 +5881,8 @@ namespace PascalABCCompiler.NETGenerator
bool tmp_virtual_method_call = virtual_method_call; bool tmp_virtual_method_call = virtual_method_call;
virtual_method_call = false; virtual_method_call = false;
value.obj.visit(this); value.obj.visit(this);
if (value.obj is ICommonClassFieldReferenceNode)
is_field_reference = true;
virtual_method_call = tmp_virtual_method_call; virtual_method_call = tmp_virtual_method_call;
is_addr = temp_is_addr; is_addr = temp_is_addr;
FldInfo fi_info = helper.GetField(value.field); FldInfo fi_info = helper.GetField(value.field);

View file

@ -1,4 +1,4 @@
/// Учебный модуль, реализующий базовые алгоритмы информатики (27.02.2024) /// Учебный модуль, реализующий базовые алгоритмы информатики (24.03.2024)
unit School; unit School;
interface interface
@ -218,14 +218,25 @@ function PrimeDivisorsCount(n: integer): integer;
/// Возвращает целочисленный список расширенного представления /// Возвращает целочисленный список расширенного представления
/// десятичного числа n по основанию base. /// десятичного числа n по основанию base.
/// По умолчанию base=10 и возвращается список десятичных цифр числа n. /// По умолчанию base=10 и возвращается список десятичных цифр числа n.
/// Обратное действие выполняет функция Refold. /// Обратное действие выполняет функция DigitsToInt64.
function Digits(n: int64; base: integer := 10): List<integer>; function Digits(n: int64; base: integer := 10): List<integer>;
/// Возвращает целочисленный список расширенного представления
/// десятичного числа n по основанию base.
/// По умолчанию base=10 и возвращается список десятичных цифр числа n.
/// Обратное действие выполняют функции DigitsToInt64 и DigitsToBigInteger.
function Digits(n: BigInteger; base: integer := 10): List<integer>;
/// Возвращает целое десятичное число на основе его расширенного представления /// Возвращает целое десятичное число на основе его расширенного представления
/// по основанию base (по умолчанию base=10). /// по основанию base (по умолчанию base=10).
/// Функция выполняет действие, обратное функции Digits, /// Функция выполняет действие, обратное функции Digits,
function DigitsToInt64(ext: List<integer>; base: integer := 10): int64; function DigitsToInt64(ext: List<integer>; base: integer := 10): int64;
/// Возвращает целое десятичное число на основе его расширенного представления
/// по основанию base (по умолчанию base=10).
/// Функция выполняет действие, обратное функции Digits,
function DigitsToBigInteger(ext: List<integer>; base: integer := 10): BigInteger;
/// Возвращает список делителей натурального числа n /// Возвращает список делителей натурального числа n
function Divisors(n: integer): List<integer>; function Divisors(n: integer): List<integer>;
@ -844,11 +855,11 @@ function PrimeDivisorsCount(Self: integer): integer; extensionmethod := PrimeDiv
/// Возвращает целочисленный список расширенного представления /// Возвращает целочисленный список расширенного представления
/// десятичного числа n по основанию base. /// десятичного числа n по основанию base.
/// По умолчанию base=10 и возвращается список десятичных цифр числа n. /// По умолчанию base=10 и возвращается список десятичных цифр числа n.
/// Обратное действие выполняет функция Refold. /// Обратное действие выполняет функция DigitsToInt64.
function Digits(n: int64; base: integer): List<integer>; function Digits(n: int64; base: integer): List<integer>;
begin begin
Result := new List<integer>; Result := new List<integer>;
if (n < 0) or (base < 2) then exit; if (n < 0) or (base < 2) or (base > integer.MaxValue) then exit;
if n = 0 then Result := Lst(0) if n = 0 then Result := Lst(0)
else else
while n > 0 do while n > 0 do
@ -866,6 +877,28 @@ function Digits(Self: integer; base: integer := 10): List<integer>;
function Digits(Self: int64; base: integer := 10): List<integer>; function Digits(Self: int64; base: integer := 10): List<integer>;
extensionmethod := Digits(Self, base); extensionmethod := Digits(Self, base);
/// Возвращает целочисленный список расширенного представления
/// десятичного числа n по основанию base.
/// По умолчанию base=10 и возвращается список десятичных цифр числа n.
/// Обратное действие выполняют функции DigitsToInt64 и DigitsToBigInteger.
function Digits(n: BigInteger; base: integer): List<integer>;
begin
Result := new List<integer>;
if (n < 0) or (base < 2) or (base > integer.MaxValue) then exit;
if n = 0 then Result := Lst(0)
else
while n > 0 do
begin
var rem := integer(n mod base);
Result.Add(rem);
n := n div base
end;
Result.Reverse
end;
function Digits(Self: Biginteger; base: integer := 10): List<integer>;
extensionmethod := Digits(Self, base);
/// Возвращает целое десятичное число на основе его расширенного представления /// Возвращает целое десятичное число на основе его расширенного представления
/// по основанию base (по умолчанию base=10). /// по основанию base (по умолчанию base=10).
/// Функция выполняет действие, обратное функции Digits /// Функция выполняет действие, обратное функции Digits
@ -881,7 +914,24 @@ begin
end; end;
function DigitsToInt64(Self: List<integer>; base: integer := 10): int64; function DigitsToInt64(Self: List<integer>; base: integer := 10): int64;
extensionmethod := DigitsToInt64(Self, base); extensionmethod := DigitsToInt64(Self, base);
/// Возвращает целое десятичное число на основе его расширенного представления
/// по основанию base (по умолчанию base=10).
/// Функция выполняет действие, обратное функции Digits,
function DigitsToBigInteger(ext: List<integer>; base: integer): BigInteger;
begin
Result := BigInteger.Zero;
var p := BigInteger.One;
for var i := ext.Count -1 downto 0 do
begin
Result += ext[i] * p;
p *= base
end
end;
function DigitsToBigInteger(Self: List<integer>; base: integer := 10): BigInteger;
extensionmethod := DigitsToBigInteger(Self, base);
{$endregion} {$endregion}

View file

@ -308,17 +308,18 @@ begin
Result := Self; Result := Self;
end; end;
function LoadFromXaml(fname: string): object; function ParseXaml(s: string): object;
begin begin
var s := ReadAllText(fname);
var context := new ParserContext(); var context := new ParserContext();
context.XmlnsDictionary.Add('','http://schemas.microsoft.com/winfx/2006/xaml/presentation'); context.XmlnsDictionary.Add('','http://schemas.microsoft.com/winfx/2006/xaml/presentation');
context.XmlnsDictionary.Add('x', 'http://schemas.microsoft.com/winfx/2006/xaml'); context.XmlnsDictionary.Add('x', 'http://schemas.microsoft.com/winfx/2006/xaml');
Result := System.Windows.Markup.XamlReader.Parse(ReadAllText(fname),nil); Result := System.Windows.Markup.XamlReader.Parse(s,context);
end;
//var s := new System.IO.FileStream(fname, System.IO.FileMode.Open); function LoadFromXaml(fname: string): object;
//Result := System.Windows.Markup.XamlReader.Load(s); begin
//s.Close(); var s := ReadAllText(fname);
Result := ParseXaml(s);
end; end;
// Функции создания элементов управления // Функции создания элементов управления

25
TestSuite/generics74.pas Normal file
View file

@ -0,0 +1,25 @@
var s: string;
type
// не обязательно auto класс, я добавил только ради конструктора
t0 = auto class
f: byte;
end;
procedure p1<T>(o: T); where T: t0;
begin
s := o.f.ToString; // Выводит 0 вместо 123
// Обязательно захватить параметр и локальную переменную лямбдой
var x := 0;
var p := procedure->
begin
o := o;
x := x;
end;
end;
begin
p1(new t0(byte(123)));
assert(s = '123');
end.