diff --git a/TestSuite/CompilationSamples/PABCSystem.pas b/TestSuite/CompilationSamples/PABCSystem.pas index ad513b7be..c1347298c 100644 --- a/TestSuite/CompilationSamples/PABCSystem.pas +++ b/TestSuite/CompilationSamples/PABCSystem.pas @@ -10200,9 +10200,9 @@ begin end; ///-- -function operator= (Self: (T1,T2); v: (T1,T2)); extensionmethod := Self.Equals( v ) ; +function operator= (Self: (T1,T2); v: (T1,T2)); extensionmethod := Object.ReferenceEquals(Self,v) ? True: Self.Equals( v ) ; ///-- -function operator<> (Self: (T1,T2); v: (T1,T2)); extensionmethod := not Self.Equals( v ); +function operator<> (Self: (T1,T2); v: (T1,T2)); extensionmethod := not (Self = v); ///-- function CompareToTup2(v1: (T1,T2); v2: (T1,T2)) := (v1 as System.IComparable).CompareTo(v2); ///-- @@ -10215,9 +10215,9 @@ function operator> (Self: (T1,T2); v: (T1,T2)); extensionmethod := Compa function operator>= (Self: (T1,T2); v: (T1,T2)); extensionmethod := CompareToTup2(Self,v) >= 0; ///-- -function operator= (Self: (T1,T2,T3); v: (T1,T2,T3)); extensionmethod := Self.Equals( v ) ; +function operator= (Self: (T1,T2,T3); v: (T1,T2,T3)); extensionmethod := Object.ReferenceEquals(Self,v) ? True: Self.Equals( v ) ; ///-- -function operator<> (Self: (T1,T2,T3); v: (T1,T2,T3)); extensionmethod := not Self.Equals( v ); +function operator<> (Self: (T1,T2,T3); v: (T1,T2,T3)); extensionmethod := not (Self = v); ///-- function CompareToTup3(v1: (T1,T2,T3); v2: (T1,T2,T3)) := (v1 as System.IComparable).CompareTo(v2); ///-- @@ -10230,9 +10230,9 @@ function operator> (Self: (T1,T2,T3); v: (T1,T2,T3)); extensionmethod function operator>= (Self: (T1,T2,T3); v: (T1,T2,T3)); extensionmethod := CompareToTup3(Self,v) >= 0; ///-- -function operator= (Self: (T1,T2,T3,T4); v: (T1,T2,T3,T4)); extensionmethod := Self.Equals( v ) ; +function operator= (Self: (T1,T2,T3,T4); v: (T1,T2,T3,T4)); extensionmethod := Object.ReferenceEquals(Self,v) ? True: Self.Equals( v ) ; ///-- -function operator<> (Self: (T1,T2,T3,T4); v: (T1,T2,T3,T4)); extensionmethod := not Self.Equals( v ); +function operator<> (Self: (T1,T2,T3,T4); v: (T1,T2,T3,T4)); extensionmethod := not (Self = v); ///-- function CompareToTup4(v1: (T1,T2,T3,T4); v2: (T1,T2,T3,T4)) := (v1 as System.IComparable).CompareTo(v2); ///-- diff --git a/TestSuite/CompilationSamples/PT4.pas b/TestSuite/CompilationSamples/PT4.pas index 941db637c..b7bca12c4 100644 --- a/TestSuite/CompilationSamples/PT4.pas +++ b/TestSuite/CompilationSamples/PT4.pas @@ -1,16 +1,16 @@ -/// Programming Taskbook 4 +/// Модуль электронного задачника Programming Taskbook 4 unit PT4; //------------------------------------------------------------------------------ -// Programming Taskbook -// 4.15 -// Copyright (c) 2006-2008 DarkStar, SSM -// Copyright (c) 2010 .., 1.3 -// Copyright (c) 2014-2015 .., 4.13 -// Copyright (c) 2015 .., 4.14 -// Copyright (c) 2016 .., 4.15 -// Copyright (c) 2017 .., 4.17 -// Programming Taskbook Copyright (c).., 1998-2017 +// Модуль для подключения задачника Programming Taskbook +// Версия 4.15 +// Copyright (©) 2006-2008 DarkStar, SSM +// Copyright (©) 2010 М.Э.Абрамян, дополнения к версии 1.3 +// Copyright (©) 2014-2015 М.Э.Абрамян, дополнения к версии 4.13 +// Copyright (©) 2015 М.Э.Абрамян, дополнения к версии 4.14 +// Copyright (©) 2016 М.Э.Абрамян, дополнения к версии 4.15 +// Copyright (©) 2017 М.Э.Абрамян, дополнения к версии 4.17 +// Электронный задачник Programming Taskbook Copyright (c)М.Э.Абрамян, 1998-2017 //------------------------------------------------------------------------------ {$apptype windows} @@ -22,9 +22,9 @@ uses System, System.Collections, System.Runtime.InteropServices; type - /// + /// Тип указателя на узел списка PNode = ^TNode; - /// + /// Тип узла списка TNode = record Data: integer; Next,Prev,Left,Right,Parent: PNode; @@ -80,240 +80,240 @@ type property Data: integer read getData write SetData; end; -/// +/// Вывести формулировку задания procedure Task(name: string); -/// +/// Ввести и вернуть значение целого типа function GetInt: integer; -/// +/// Ввести и вернуть значение целого типа function GetInteger: integer; -/// +/// Ввести и вернуть значение вещественного типа function GetReal: real; -/// +/// Ввести и вернуть значение вещественного типа function GetDouble: real; -/// +/// Ввести и вернуть значение символьного типа function GetChar: char; -/// +/// Ввести и вернуть значение строкового типа function GetString: string; -/// +/// Ввести и вернуть значение логического типа function GetBool: boolean; -/// +/// Ввести и вернуть значение логического типа function GetBoolean: boolean; -/// Node +/// Ввести и вернуть значение типа Node function GetNode: Node; -/// PNode +/// Ввести и вернуть значение типа PNode function GetPNode: PNode; -/// integer +/// Возвращает введенное значение типа integer function ReadInteger: integer; -/// real +/// Возвращает введенное значение типа real function ReadReal: real; -/// char +/// Возвращает введенное значение типа char function ReadChar: char; -/// string +/// Возвращает введенное значение типа string function ReadString: string; -/// boolean +/// Возвращает введенное значение типа boolean function ReadBoolean: boolean; -/// PNode +/// Возвращает введенное значение типа PNode function ReadPNode: PNode; -/// Node +/// Возвращает введенное значение типа Node function ReadNode: Node; -/// integer +/// Возвращает введенное значение типа integer function ReadlnInteger: integer; -/// real +/// Возвращает введенное значение типа real function ReadlnReal: real; -/// char +/// Возвращает введенное значение типа char function ReadlnChar: char; -/// string +/// Возвращает введенное значение типа string function ReadlnString: string; -/// boolean +/// Возвращает введенное значение типа boolean function ReadlnBoolean: boolean; -/// PNode +/// Возвращает введенное значение типа PNode function ReadlnPNode: PNode; -/// Node +/// Возвращает введенное значение типа Node function ReadlnNode: Node; -// == 4.15. == +// == Версия 4.15. Дополнения == -/// integer. -/// prompt +/// Возвращает введенное значение типа integer. +/// Строковое приглашение prompt игнорируется function ReadInteger(prompt: string): integer; -/// real. -/// prompt +/// Возвращает введенное значение типа real. +/// Строковое приглашение prompt игнорируется function ReadReal(prompt: string): real; -/// char. -/// prompt +/// Возвращает введенное значение типа char. +/// Строковое приглашение prompt игнорируется function ReadChar(prompt: string): char; -/// string. -/// prompt +/// Возвращает введенное значение типа string. +/// Строковое приглашение prompt игнорируется function ReadString(prompt: string): string; -/// boolean. -/// prompt +/// Возвращает введенное значение типа boolean. +/// Строковое приглашение prompt игнорируется function ReadBoolean(prompt: string): boolean; -/// PNode. -/// prompt +/// Возвращает введенное значение типа PNode. +/// Строковое приглашение prompt игнорируется function ReadPNode(prompt: string): PNode; -/// Node. -/// prompt +/// Возвращает введенное значение типа Node. +/// Строковое приглашение prompt игнорируется function ReadNode(prompt: string): Node; -/// integer. -/// prompt +/// Возвращает введенное значение типа integer. +/// Строковое приглашение prompt игнорируется function ReadlnInteger(prompt: string): integer; -/// real. -/// prompt +/// Возвращает введенное значение типа real. +/// Строковое приглашение prompt игнорируется function ReadlnReal(prompt: string): real; -/// char. -/// prompt +/// Возвращает введенное значение типа char. +/// Строковое приглашение prompt игнорируется function ReadlnChar(prompt: string): char; -/// string. -/// prompt +/// Возвращает введенное значение типа string. +/// Строковое приглашение prompt игнорируется function ReadlnString(prompt: string): string; -/// boolean. -/// prompt +/// Возвращает введенное значение типа boolean. +/// Строковое приглашение prompt игнорируется function ReadlnBoolean(prompt: string): boolean; -/// PNode. -/// prompt +/// Возвращает введенное значение типа PNode. +/// Строковое приглашение prompt игнорируется function ReadlnPNode(prompt: string): PNode; -/// Node. -/// prompt +/// Возвращает введенное значение типа Node. +/// Строковое приглашение prompt игнорируется function ReadlnNode(prompt: string): Node; -// == 4.15. == +// == Версия 4.15. Конец дополнений == -// == 4.17. == +// == Версия 4.17. Дополнения == -/// integer +/// Возвращает кортеж из двух введенных значений типа integer function ReadInteger2: (integer, integer); -/// real +/// Возвращает кортеж из двух введенных значений типа real function ReadReal2: (real, real); -/// char +/// Возвращает кортеж из двух введенных значений типа char function ReadChar2: (char, char); -/// string +/// Возвращает кортеж из двух введенных значений типа string function ReadString2: (string, string); -/// boolean +/// Возвращает кортеж из двух введенных значений типа boolean function ReadBoolean2: (boolean, boolean); -/// Node +/// Возвращает кортеж из двух введенных значений типа Node function ReadNode2: (Node, Node); -/// integer +/// Возвращает кортеж из двух введенных значений типа integer function ReadlnInteger2: (integer, integer); -/// real +/// Возвращает кортеж из двух введенных значений типа real function ReadlnReal2: (real, real); -/// char +/// Возвращает кортеж из двух введенных значений типа char function ReadlnChar2: (char, char); -/// string +/// Возвращает кортеж из двух введенных значений типа string function ReadlnString2: (string, string); -/// boolean +/// Возвращает кортеж из двух введенных значений типа boolean function ReadlnBoolean2: (boolean, boolean); -/// Node +/// Возвращает кортеж из двух введенных значений типа Node function ReadlnNode2: (Node, Node); -/// integer +/// Возвращает кортеж из трех введенных значений типа integer function ReadInteger3: (integer, integer, integer); -/// real +/// Возвращает кортеж из трех введенных значений типа real function ReadReal3: (real, real, real); -/// char +/// Возвращает кортеж из трех введенных значений типа char function ReadChar3: (char, char, char); -/// string +/// Возвращает кортеж из трех введенных значений типа string function ReadString3: (string, string, string); -/// boolean +/// Возвращает кортеж из трех введенных значений типа boolean function ReadBoolean3: (boolean, boolean, boolean); -/// Node +/// Возвращает кортеж из трех введенных значений типа Node function ReadNode3: (Node, Node, Node); -/// integer +/// Возвращает кортеж из трех введенных значений типа integer function ReadlnInteger3: (integer, integer, integer); -/// real +/// Возвращает кортеж из трех введенных значений типа real function ReadlnReal3: (real, real, real); -/// char +/// Возвращает кортеж из трех введенных значений типа char function ReadlnChar3: (char, char, char); -/// string +/// Возвращает кортеж из трех введенных значений типа string function ReadlnString3: (string, string, string); -/// boolean +/// Возвращает кортеж из трех введенных значений типа boolean function ReadlnBoolean3: (boolean, boolean, boolean); -/// Node +/// Возвращает кортеж из трех введенных значений типа Node function ReadlnNode3: (Node, Node, Node); -/// integer. -/// prompt +/// Возвращает кортеж из двух введенных значений типа integer. +/// Строковое приглашение prompt игнорируется function ReadInteger2(prompt: string): (integer, integer); -/// real. -/// prompt +/// Возвращает кортеж из двух введенных значений типа real. +/// Строковое приглашение prompt игнорируется function ReadReal2(prompt: string): (real, real); -/// char. -/// prompt +/// Возвращает кортеж из двух введенных значений типа char. +/// Строковое приглашение prompt игнорируется function ReadChar2(prompt: string): (char, char); -/// string. -/// prompt +/// Возвращает кортеж из двух введенных значений типа string. +/// Строковое приглашение prompt игнорируется function ReadString2(prompt: string): (string, string); -/// boolean. -/// prompt +/// Возвращает кортеж из двух введенных значений типа boolean. +/// Строковое приглашение prompt игнорируется function ReadBoolean2(prompt: string): (boolean, boolean); -/// Node. -/// prompt +/// Возвращает кортеж из двух введенных значений типа Node. +/// Строковое приглашение prompt игнорируется function ReadNode2(prompt: string): (Node, Node); -/// integer. -/// prompt +/// Возвращает кортеж из двух введенных значений типа integer. +/// Строковое приглашение prompt игнорируется function ReadlnInteger2(prompt: string): (integer, integer); -/// real. -/// prompt +/// Возвращает кортеж из двух введенных значений типа real. +/// Строковое приглашение prompt игнорируется function ReadlnReal2(prompt: string): (real, real); -/// char. -/// prompt +/// Возвращает кортеж из двух введенных значений типа char. +/// Строковое приглашение prompt игнорируется function ReadlnChar2(prompt: string): (char, char); -/// string. -/// prompt +/// Возвращает кортеж из двух введенных значений типа string. +/// Строковое приглашение prompt игнорируется function ReadlnString2(prompt: string): (string, string); -/// boolean. -/// prompt +/// Возвращает кортеж из двух введенных значений типа boolean. +/// Строковое приглашение prompt игнорируется function ReadlnBoolean2(prompt: string): (boolean, boolean); -/// Node. -/// prompt +/// Возвращает кортеж из двух введенных значений типа Node. +/// Строковое приглашение prompt игнорируется function ReadlnNode2(prompt: string): (Node, Node); -/// integer. -/// prompt +/// Возвращает кортеж из трех введенных значений типа integer. +/// Строковое приглашение prompt игнорируется function ReadInteger3(prompt: string): (integer, integer, integer); -/// real. -/// prompt +/// Возвращает кортеж из трех введенных значений типа real. +/// Строковое приглашение prompt игнорируется function ReadReal3(prompt: string): (real, real, real); -/// char. -/// prompt +/// Возвращает кортеж из трех введенных значений типа char. +/// Строковое приглашение prompt игнорируется function ReadChar3(prompt: string): (char, char, char); -/// string. -/// prompt +/// Возвращает кортеж из трех введенных значений типа string. +/// Строковое приглашение prompt игнорируется function ReadString3(prompt: string): (string, string, string); -/// boolean. -/// prompt +/// Возвращает кортеж из трех введенных значений типа boolean. +/// Строковое приглашение prompt игнорируется function ReadBoolean3(prompt: string): (boolean, boolean, boolean); -/// Node. -/// prompt +/// Возвращает кортеж из трех введенных значений типа Node. +/// Строковое приглашение prompt игнорируется function ReadNode3(prompt: string): (Node, Node, Node); -/// integer. -/// prompt +/// Возвращает кортеж из трех введенных значений типа integer. +/// Строковое приглашение prompt игнорируется function ReadlnInteger3(prompt: string): (integer, integer, integer); -/// real. -/// prompt +/// Возвращает кортеж из трех введенных значений типа real. +/// Строковое приглашение prompt игнорируется function ReadlnReal3(prompt: string): (real, real, real); -/// char. -/// prompt +/// Возвращает кортеж из трех введенных значений типа char. +/// Строковое приглашение prompt игнорируется function ReadlnChar3(prompt: string): (char, char, char); -/// string. -/// prompt +/// Возвращает кортеж из трех введенных значений типа string. +/// Строковое приглашение prompt игнорируется function ReadlnString3(prompt: string): (string, string, string); -/// boolean. -/// prompt +/// Возвращает кортеж из трех введенных значений типа boolean. +/// Строковое приглашение prompt игнорируется function ReadlnBoolean3(prompt: string): (boolean, boolean, boolean); -/// Node. -/// prompt +/// Возвращает кортеж из трех введенных значений типа Node. +/// Строковое приглашение prompt игнорируется function ReadlnNode3(prompt: string): (Node, Node, Node); -// == 4.17. == +// == Версия 4.17. Конец дополнений == procedure GetR(var param: real); @@ -341,9 +341,9 @@ procedure Put(param: boolean); procedure Put(param: PNode); procedure Put(param: Node); -// +//Ввод этих данных не поддерживается ///- read(a,b,...) -/// a,b,... +/// Вводит значения a,b,... из окна электронного задачника procedure read(var x: byte); ///-- procedure read(var x: shortint); @@ -381,21 +381,21 @@ procedure Readln; procedure Print(params args: array of object); procedure Println(params args: array of object); -// == 4.15. == +// == Версия 4.15. Дополнения == procedure Print(s: string); procedure Println(s: string); -// == 4.15. == +// == Версия 4.15. Конец дополнений == -/// , , p +/// Освобождает память, выделенную динамически, на которую указывает p procedure Dispose(p: pointer); -// - Intellisense -// , - write +// Фиктивная пустая процедура - для Intellisense +// Нет, нельзя пользоваться - закрываются процедуры write системного модуля ///- write(a,b,...) -/// a,b,... +/// Выводит значения a,b,... в окно электронного задачника //procedure write; ///-- @@ -403,162 +403,162 @@ procedure __InitModule__; ///-- procedure __FinalizeModule__; -// == 1.3. == +// == Версия 1.3. Дополнения == -/// S +/// Выводит строку S в разделе отладки окна задачника procedure Show(S: string); -/// A S -/// ; W +/// Выводит число A с комментарием S в разделе отладки +/// окна задачника; для вывода числа отводится W экранных позиций procedure Show(S: string; A: integer; W: integer); -/// A S -/// ; W +/// Выводит число A с комментарием S в разделе отладки +/// окна задачника; для вывода числа отводится W экранных позиций procedure Show(S: string; A: real; W: integer); -/// A S +/// Выводит число A с комментарием S в разделе отладки окна задачника procedure Show(S: string; A: integer); -/// A S +/// Выводит число A с комментарием S в разделе отладки окна задачника procedure Show(S: string; A: real); -/// A ; -/// W +/// Выводит число A в разделе отладки окна задачника; +/// для вывода отводится W экранных позиций procedure Show(A: integer; W: integer); -/// A ; -/// W +/// Выводит число A в разделе отладки окна задачника; +/// для вывода отводится W экранных позиций procedure Show(A: real; W: integer); -/// A +/// Выводит число A в разделе отладки окна задачника procedure Show(A: integer); -/// A +/// Выводит число A в разделе отладки окна задачника procedure Show(A: real); -/// -/// +/// Выполняет переход на новую экранную строку +/// в разделе отладки окна задачника procedure ShowLine; -/// S , -/// +/// Выводит строку S в разделе отладки окна задачника, +/// после чего выполняет переход на новую экранную строку procedure ShowLine(S: string); -/// A S -/// ; W . -/// +/// Выводит число A с комментарием S в разделе отладки +/// окна задачника; для вывода числа отводится W экранных позиций. +/// После вывода данных выполняет переход на новую экранную строку procedure ShowLine(S: string; A: integer; W: integer); -/// A S -/// ; W . -/// +/// Выводит число A с комментарием S в разделе отладки +/// окна задачника; для вывода числа отводится W экранных позиций. +/// После вывода данных выполняет переход на новую экранную строку procedure ShowLine(S: string; A: real; W: integer); -/// A S , -/// +/// Выводит число A с комментарием S в разделе отладки окна задачника, +/// после чего выполняет переход на новую экранную строку procedure ShowLine(S: string; A: integer); -/// A S , -/// +/// Выводит число A с комментарием S в разделе отладки окна задачника, +/// после чего выполняет переход на новую экранную строку procedure ShowLine(S: string; A: real); -/// A ; -/// W . -/// +/// Выводит число A в разделе отладки окна задачника; +/// для вывода отводится W экранных позиций. +/// После вывода числа выполняет переход на новую экранную строку procedure ShowLine(A: integer; W: integer); -/// A ; -/// W . -/// +/// Выводит число A в разделе отладки окна задачника; +/// для вывода отводится W экранных позиций. +/// После вывода числа выполняет переход на новую экранную строку procedure ShowLine(A: real; W: integer); -/// A , -/// +/// Выводит число A в разделе отладки окна задачника, +/// после чего выполняет переход на новую экранную строку procedure ShowLine(A: integer); -/// A , -/// +/// Выводит число A в разделе отладки окна задачника, +/// после чего выполняет переход на новую экранную строку procedure ShowLine(A: real); -/// -/// . N > 0, -/// N . N = 0, -/// , -/// +/// Настраивает формат вывода вещественных чисел в разделе отладки +/// окна задачника. Если N > 0, то число выводится в формате +/// с фиксированной точкой и N дробными знаками. Если N = 0, +/// то число выводится в экспоненциальном формате, число дробных +/// знаков определяется шириной поля вывода procedure SetPrecision(N: integer); -/// -/// , +/// Обеспечивает автоматическое скрытие всех разделов +/// окна задачника, кроме раздела отладки procedure HideTask; -// == 1.3 == +// == Конец дополнений к версии 1.3 == -// == 4.14. == +// == Версия 4.14. Дополнения == -/// n -/// +/// Вводит n целых чисел +/// и возвращает введенные числа в виде массива function ReadArrInteger(n: integer): array of integer; -/// n -/// +/// Вводит n вещественных чисел +/// и возвращает введенные числа в виде массива function ReadArrReal(n: integer): array of real; -/// n -/// +/// Вводит n строк +/// и возвращает введенные строки в виде массива function ReadArrString(n: integer): array of string; -/// n -/// +/// Вводит n целых чисел +/// и возвращает введенные числа в виде последовательности function ReadSeqInteger(n: integer): sequence of integer; -/// n -/// +/// Вводит n вещественных чисел +/// и возвращает введенные числа в виде последовательности function ReadSeqReal(n: integer): sequence of real; -/// n -/// +/// Вводит n строк +/// и возвращает введенные строки в виде последовательности function ReadSeqString(n: integer): sequence of string; -/// -/// +/// Вводит размер набора целых чисел и его элементы +/// и возвращает введенный набор в виде последовательности function ReadSeqInteger(): sequence of integer; -/// -/// +/// Вводит размер набора вещественных чисел и его элементы +/// и возвращает введенный набор в виде последовательности function ReadSeqReal(): sequence of real; -/// -/// +/// Вводит размер набора строк и его элементы +/// и возвращает введенный набор в виде последовательности function ReadSeqString(): sequence of string; -/// -/// +/// Вводит размер набора целых чисел и его элементы +/// и возвращает введенный набор в виде массива function ReadArrInteger(): array of integer; -/// -/// +/// Вводит размер набора вещественных чисел и его элементы +/// и возвращает введенный набор в виде массива function ReadArrReal(): array of real; -/// -/// +/// Вводит размер набора строк и его элементы +/// и возвращает введенный набор в виде массива function ReadArrString(): array of string; -/// m n +/// Вводит целую матрицу размера m на n по строкам function ReadMatrInteger(m,n: integer): array [,] of integer; -/// +/// Вводит размеры матрицы и затем целую матрицу указанных размеров по строкам function ReadMatrInteger(): array [,] of integer; -/// m n +/// Вводит вещественную матрицу размера m на n по строкам function ReadMatrReal(m,n: integer): array [,] of real; -/// +/// Вводит размеры матрицы и затем вещественную матрицу указанных размеров по строкам function ReadMatrReal(): array [,] of real; -/// m n +/// Вводит матрицу из строк размера m на n по строкам function ReadMatrString(m,n: integer): array [,] of string; -/// +/// Вводит размеры матрицы и затем строковую матрицу указанных размеров по строкам function ReadMatrString(): array [,] of string; procedure ReadMatr(var m, n: integer; var a: array [,] of integer); @@ -603,7 +603,7 @@ procedure WriteMatr(a: array of array of T); procedure WriteMatr(a: List>); -// == 2016.07 +// == Дополнения 2016.07 procedure PrintMatr(a: array[,] of T); @@ -611,16 +611,16 @@ procedure PrintMatr(a: array of array of T); procedure PrintMatr(a: List>); -// == 2016.07 +// == Конец дополнений 2016.07 -// == 4.14 == +// == Конец дополнений к версии 4.14 == implementation const - NotSupportedReadTypeMessage = ' {0} '; - NotSupportedWriteTypeMessage = ' {0} '; - eMessage = ' Node Dispose'; + NotSupportedReadTypeMessage = 'Ввод данных типа {0} не поддерживается'; + NotSupportedWriteTypeMessage = 'Вывод данных типа {0} не поддерживается'; + eMessage = 'Попытка обращения к объекту Node после вызова его метода Dispose'; var loadNodes: ArrayList; @@ -1058,7 +1058,7 @@ begin end; // ----------------------------------------------------- -// Get +// Функции Get // ----------------------------------------------------- function GetInt: integer; var val:integer; @@ -1094,7 +1094,7 @@ end; function GetString: string; var val: System.Text.StringBuilder; begin - val := new System.Text.StringBuilder(200);//TODO 200? + val := new System.Text.StringBuilder(200);//TODO почему 200? _gets(val); result := val.ToString; end; @@ -1125,8 +1125,8 @@ var p: IntPtr; sNode: InternalNode; begin - //raise new NotSupportedException(' PT4 . '); - //result := new PT4Node(sNode, p);// fixme ! + //raise new NotSupportedException('Работа с динамическими структурами задачника PT4 не поддерживается в этой версии компилятора. Исправление ошибки планируется в следуйщей версии'); + //result := new PT4Node(sNode, p);// fixme здесь ошибка генерации кода! p := IntPtr.Zero; sNode.Data := 0; sNode.Next := IntPtr.Zero; @@ -1225,7 +1225,7 @@ begin Result := GetNode; end; -// == 4.15. == +// == Версия 4.15. Дополнения == function ReadInteger(prompt: string): integer; begin @@ -1297,9 +1297,9 @@ begin Result := GetNode; end; -// == 4.15. == +// == Версия 4.15. Конец дополнений == -// == 4.17. == +// == Версия 4.17. Дополнения == function ReadInteger2: (integer, integer); begin @@ -1541,11 +1541,11 @@ begin Result := (GetNode, GetNode, GetNode); end; -// == 4.17. == +// == Версия 4.17. Конец дополнений == // ----------------------------------------------------- -// Put +// Процедуры Put // ----------------------------------------------------- procedure PutInt(val: integer); begin @@ -1594,7 +1594,7 @@ begin end; // ----------------------------------------------------- -// +// Генерация исключений // ----------------------------------------------------- procedure RaisePTAndCheckPT(e: Exception); begin @@ -1719,7 +1719,7 @@ begin Print(args); end; -// == 4.15. == +// == Версия 4.15. Дополнения == procedure Print(s: string); begin @@ -1731,7 +1731,7 @@ begin write(s); end; -// == 4.15. == +// == Версия 4.15. Конец дополнений == {procedure write; begin @@ -1769,7 +1769,7 @@ begin var ip := IntPtr(PointerOutput(args[i]).p); _PutP(ip); end -// == 4.17. == +// == Версия 4.17. Дополнения == else if args[i].GetType.FullName.StartsWith('System.Tuple') then foreach var e in args[i].GetType.GetProperties do InternalWrite(Arr(e.GetValue(args[i],nil))) @@ -1779,7 +1779,7 @@ begin while e.MoveNext do InternalWrite(Arr(e.Current)); end -// == 4.17. == +// == Версия 4.17. Конец дополнений == else GenerateNotSupportedWriteTypeException(args[i].GetType.ToString); end; @@ -1815,7 +1815,7 @@ begin if InfoT=0 then Console.WriteLine(InfoS); FreePT; - // == 4.13 == + // == Начало дополнений к версии 4.13 == var fpt := FinishPT; if fpt = 1 then exit; var asm := System.Reflection.Assembly.GetExecutingAssembly; @@ -1864,10 +1864,10 @@ begin inc(i); fpt := FinishPT; end; - // == 4.13 == + // == Конец дополнений к версии 4.13 == end; -// == 1.3. == +// == Версия 1.3. Дополнения == var D: integer := 2; @@ -1989,9 +1989,9 @@ begin D := N; end; -// == 1.3 == +// == Конец дополнений к версии 1.3 == -// == 4.14. == +// == Версия 4.14. Дополнения == function ReadSeqInteger(): sequence of integer; begin @@ -2263,7 +2263,7 @@ begin write(a[i][j]); end; -/// +/// Выводит размер и элементы последовательности procedure WriteAll(self: sequence of T); extensionmethod; begin var b := self.ToArray(); @@ -2272,7 +2272,7 @@ begin PT4.Put(e); end; -/// +/// Выводит элементы последовательности procedure Write(self: sequence of T); extensionmethod; begin var b := self.ToArray(); @@ -2280,14 +2280,14 @@ begin PT4.Put(e); end; -/// +/// Выводит элементы динамического массива procedure Write(self: array of T); extensionmethod; begin for var i:=0 to self.Length-1 do PT4.Put(self[i]); end; -/// +/// Выводит элементы матрицы procedure Write(self: array [,] of T); extensionmethod; begin for var i:=0 to self.GetLength(0)-1 do @@ -2295,7 +2295,7 @@ begin PT4.Put(self[i,j]); end; -// == 2016.07 +// == Дополнения 2016.07 procedure PrintMatr(a: array[,] of T); begin @@ -2318,7 +2318,7 @@ begin write(a[i][j]); end; -/// +/// Выводит размер и элементы последовательности procedure PrintAll(self: sequence of T); extensionmethod; begin var b := self.ToArray(); @@ -2327,7 +2327,7 @@ begin PT4.Put(e); end; -/// +/// Выводит размер и элементы динамического массива procedure PrintAll(self: array of T); extensionmethod; begin PT4.Put(self.Length); @@ -2335,7 +2335,7 @@ begin PT4.Put(self[i]); end; -/// +/// Выводит размер и элементы динамического массива procedure WriteAll(self: array of T); extensionmethod; begin PT4.Put(self.Length); @@ -2343,7 +2343,7 @@ begin PT4.Put(self[i]); end; -/// +/// Выводит элементы последовательности procedure Writeln(self: sequence of T); extensionmethod; begin var b := self.ToArray(); @@ -2351,14 +2351,14 @@ begin PT4.Put(e); end; -/// +/// Выводит элементы динамического массива procedure Writeln(self: array of T); extensionmethod; begin for var i:=0 to self.Length-1 do PT4.Put(self[i]); end; -/// +/// Выводит элементы матрицы procedure Writeln(self: array [,] of T); extensionmethod; begin for var i:=0 to self.GetLength(0)-1 do @@ -2366,13 +2366,13 @@ begin PT4.Put(self[i,j]); end; -// == 2016.07 +// == Конец дополнений 2016.07 -/// -/// cmt, , -/// -/// - +/// Выводит в разделе отладки окна задачника +/// комментарий cmt, размер последовательности и значения, +/// полученные из элементов последовательности +/// с помощью указанного лямбда-выражения function Show(self: sequence of TSource; cmt: string; selector: System.Func): sequence of TSource; extensionmethod; begin @@ -2385,17 +2385,17 @@ begin result := self; end; -/// -/// , -/// -/// - +/// Выводит в разделе отладки окна задачника +/// размер последовательности и значения, +/// полученные из элементов последовательности +/// с помощью указанного лямбда-выражения function Show(Self: sequence of TSource; selector: System.Func): sequence of TSource; extensionmethod; begin result := self.Show('', selector); end; -/// -/// cmt, +/// Выводит в разделе отладки окна задачника +/// комментарий cmt, размер последовательности и ее элементы function Show(Self: sequence of TSource; cmt: string): sequence of TSource; extensionmethod; begin result := self; @@ -2414,14 +2414,14 @@ begin end; -/// -/// . +/// Выводит в разделе отладки окна задачника +/// размер последовательности и ее элементы. function Show(Self: sequence of TSource): sequence of TSource; extensionmethod; begin result := self.Show(''); end; -// == 4.14 == +// == Конец дополнений к версии 4.14 == initialization __InitModule; diff --git a/TestSuite/CompilationSamples/PT4Exam.pas b/TestSuite/CompilationSamples/PT4Exam.pas index 02de9ad3e..86af152c8 100644 --- a/TestSuite/CompilationSamples/PT4Exam.pas +++ b/TestSuite/CompilationSamples/PT4Exam.pas @@ -4,7 +4,7 @@ unit PT4Exam; //------------------------------------------------------------------------------ // Модуль для подключения задачника PT for Exam // Версия 1.2 -// Copyright (c) 2014-2017 М.Э.Абрамян +// Copyright (©) 2014-2017 М.Э.Абрамян //------------------------------------------------------------------------------ diff --git a/TestSuite/CompilationSamples/PT4TaskMakerNET.pas b/TestSuite/CompilationSamples/PT4TaskMakerNET.pas index a6044e10e..68cf6c3c4 100644 --- a/TestSuite/CompilationSamples/PT4TaskMakerNET.pas +++ b/TestSuite/CompilationSamples/PT4TaskMakerNET.pas @@ -6,7 +6,7 @@ unit PT4TaskMakerNET; //------------------------------------------------------------------------------ // Модуль для создания NET-библиотек с группами заданий в системе PascalABC.NET // -// Copyright (c) 2013 М.Э.Абрамян +// Copyright (©) 2013 М.Э.Абрамян // Электронный задачник Programming Taskbook Copyright (c) М.Э.Абрамян,1998-2013 //------------------------------------------------------------------------------ diff --git a/TestSuite/CompilationSamples/graph3d.pas b/TestSuite/CompilationSamples/graph3d.pas index eb4adeb50..01340e6a4 100644 --- a/TestSuite/CompilationSamples/graph3d.pas +++ b/TestSuite/CompilationSamples/graph3d.pas @@ -1,3 +1,5 @@ +// Copyright () Ivan Bondarev, Stanislav Mihalkovich (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) unit Graph3D; {$reference 'PresentationFramework.dll'} diff --git a/TestSuite/lambdas_closures_11.pas b/TestSuite/lambdas_closures_11.pas new file mode 100644 index 000000000..6b3752967 --- /dev/null +++ b/TestSuite/lambdas_closures_11.pas @@ -0,0 +1,18 @@ +var a: integer; +type + t1 = class + + public constructor(i: integer); + begin + var p:procedure := () ->begin + a := i; + end; + p; + end; + + end; + +begin + var t := new t1(2); + assert(a = 2); +end. \ No newline at end of file diff --git a/TreeConverter/LambdaExpressions/Closure/CapturedVariablesSubstitutor.cs b/TreeConverter/LambdaExpressions/Closure/CapturedVariablesSubstitutor.cs index 102f65cdb..fc29d4f5c 100644 --- a/TreeConverter/LambdaExpressions/Closure/CapturedVariablesSubstitutor.cs +++ b/TreeConverter/LambdaExpressions/Closure/CapturedVariablesSubstitutor.cs @@ -746,8 +746,10 @@ namespace TreeConverter.LambdaExpressions.Closure { nodesToAdd.Add(generatedClass.AssignNodeForUpperClassFieldInitialization); } - - statementList.subnodes.InsertRange(0, nodesToAdd); + int ind = 0; + if (statementList.subnodes.Count > 0 && statementList.subnodes[0] is procedure_call && (statementList.subnodes[0] as procedure_call).func_name is inherited_ident) + ind = 1; + statementList.subnodes.InsertRange(ind, nodesToAdd); } } diff --git a/TreeConverter/TreeConversion/compilation_context.cs b/TreeConverter/TreeConversion/compilation_context.cs index c1f2c4b8e..0969cac3e 100644 --- a/TreeConverter/TreeConversion/compilation_context.cs +++ b/TreeConverter/TreeConversion/compilation_context.cs @@ -282,7 +282,14 @@ namespace PascalABCCompiler.TreeConverter internal bool can_call_inherited_ctor_call(statements_list lst) { - return lst.statements.Count == 0; + if (lst.statements.Count == 0) + return true; + if (lst.statements[0] is basic_function_call) + { + base_function_call bfc = lst.statements[0] as basic_function_call; + + } + return false; } public void reset()