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;
virtual_method_call = false;
value.obj.visit(this);
if (value.obj is ICommonClassFieldReferenceNode)
is_field_reference = true;
virtual_method_call = tmp_virtual_method_call;
is_addr = temp_is_addr;
FldInfo fi_info = helper.GetField(value.field);

View file

@ -1,4 +1,4 @@
/// Учебный модуль, реализующий базовые алгоритмы информатики (27.02.2024)
/// Учебный модуль, реализующий базовые алгоритмы информатики (24.03.2024)
unit School;
interface
@ -218,14 +218,25 @@ function PrimeDivisorsCount(n: integer): integer;
/// Возвращает целочисленный список расширенного представления
/// десятичного числа n по основанию base.
/// По умолчанию base=10 и возвращается список десятичных цифр числа n.
/// Обратное действие выполняет функция Refold.
/// Обратное действие выполняет функция DigitsToInt64.
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).
/// Функция выполняет действие, обратное функции Digits,
function DigitsToInt64(ext: List<integer>; base: integer := 10): int64;
/// Возвращает целое десятичное число на основе его расширенного представления
/// по основанию base (по умолчанию base=10).
/// Функция выполняет действие, обратное функции Digits,
function DigitsToBigInteger(ext: List<integer>; base: integer := 10): BigInteger;
/// Возвращает список делителей натурального числа n
function Divisors(n: integer): List<integer>;
@ -844,11 +855,11 @@ function PrimeDivisorsCount(Self: integer): integer; extensionmethod := PrimeDiv
/// Возвращает целочисленный список расширенного представления
/// десятичного числа n по основанию base.
/// По умолчанию base=10 и возвращается список десятичных цифр числа n.
/// Обратное действие выполняет функция Refold.
/// Обратное действие выполняет функция DigitsToInt64.
function Digits(n: int64; base: integer): List<integer>;
begin
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)
else
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>;
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).
/// Функция выполняет действие, обратное функции Digits
@ -883,6 +916,23 @@ end;
function DigitsToInt64(Self: List<integer>; base: integer := 10): int64;
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}
{$region Divisors}

View file

@ -308,17 +308,18 @@ begin
Result := Self;
end;
function LoadFromXaml(fname: string): object;
function ParseXaml(s: string): object;
begin
var s := ReadAllText(fname);
var context := new ParserContext();
context.XmlnsDictionary.Add('','http://schemas.microsoft.com/winfx/2006/xaml/presentation');
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);
//Result := System.Windows.Markup.XamlReader.Load(s);
//s.Close();
function LoadFromXaml(fname: string): object;
begin
var s := ReadAllText(fname);
Result := ParseXaml(s);
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.