From 7908a033bd1c56d21dfcb728f7f0d053ab3fe66e Mon Sep 17 00:00:00 2001 From: miks1965 Date: Tue, 23 Feb 2016 23:28:56 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B8=D1=87=D1=91=D1=81=D1=8B?= =?UTF-8?q?=D0=B2=D0=B0=D1=8E=20PABCSystem.pas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Configuration/GlobalAssemblyInfo.cs | 2 +- Configuration/Version.defs | 4 +- ReleaseGenerators/PascalABCNET_version.nsh | 2 +- TestSuite/foreachvar1.pas | 7 - TestSuite/foreachvar3.pas | 13 + .../TreeConversion/syntax_tree_visitor.cs | 8 +- bin/Lib/PABCRtl.dll | Bin 493056 -> 493056 bytes bin/Lib/PABCSystem.axml | 627 ++++++++++++++++-- bin/Lib/PABCSystem.pas | 609 +++++++++-------- 9 files changed, 920 insertions(+), 352 deletions(-) create mode 100644 TestSuite/foreachvar3.pas diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index 80484afb7..0ab79fab0 100644 --- a/Configuration/GlobalAssemblyInfo.cs +++ b/Configuration/GlobalAssemblyInfo.cs @@ -15,7 +15,7 @@ internal static class RevisionClass public const string Major = "3"; public const string Minor = "1"; public const string Build = "0"; - public const string Revision = "1173"; + public const string Revision = "1174"; public const string MainVersion = Major + "." + Minor; public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision; diff --git a/Configuration/Version.defs b/Configuration/Version.defs index 89d0d34d3..8534bda76 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ -%COREVERSION%=0 -%REVISION%=1173 %MINOR%=1 +%REVISION%=1174 +%COREVERSION%=0 %MAJOR%=3 diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index 2512bb1c6..a4a320ae9 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.1.0.1173' +!define VERSION '3.1.0.1174' diff --git a/TestSuite/foreachvar1.pas b/TestSuite/foreachvar1.pas index 18fae17f9..2ec258d6e 100644 --- a/TestSuite/foreachvar1.pas +++ b/TestSuite/foreachvar1.pas @@ -1,10 +1,3 @@ -{begin - var s := [1,2,3]; - foreach var x in s do - begin - var y := x + x; - end; -end.} type TPair = auto class Key: string; diff --git a/TestSuite/foreachvar3.pas b/TestSuite/foreachvar3.pas new file mode 100644 index 000000000..6f70a80e6 --- /dev/null +++ b/TestSuite/foreachvar3.pas @@ -0,0 +1,13 @@ +procedure p(s: set of T; f: T->T); +begin + foreach var x in s do + begin + var y := f(x); + Print(y); + end; +end; + +begin + var s := [1,2,3,7,2,4]; + p(s,x->x); +end. diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index d589cb36f..f93271d21 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -16287,12 +16287,11 @@ namespace PascalABCCompiler.TreeConverter } } - foreach (SemanticTree.ITypeNode itn in tn.ImplementingInterfaces) + foreach (SemanticTree.ITypeNode itn in tn.ImplementingInterfaces) // если не нашли - ищем интерфейс IEnumerable и возвращаем object в качестве elem_type { - //if (itn == ctn) if (itn is compiled_type_node) { - var itnc = (itn as compiled_type_node).compiled_type; + /*var itnc = (itn as compiled_type_node).compiled_type; if (itnc.IsGenericType) { var my = itnc.GetGenericTypeDefinition();// = typeof(System.Collections.Generic.IEnumerable<>) @@ -16303,7 +16302,8 @@ namespace PascalABCCompiler.TreeConverter return true; } } - else if (itn == ctn) + else */ + if (itn == ctn) { elem_type = SystemLibrary.SystemLibrary.object_type; return true; diff --git a/bin/Lib/PABCRtl.dll b/bin/Lib/PABCRtl.dll index 2e2e71f5c3de592eb31859b993c8940e370ab941..fd115f21cee660b7774b157f40958c0f0daecf9f 100644 GIT binary patch delta 65254 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 qc=G?guMTk^5L(99JnB+#f79jFQ2zhqxs~1k diff --git a/bin/Lib/PABCSystem.axml b/bin/Lib/PABCSystem.axml index 0427cc51c..966193809 100644 --- a/bin/Lib/PABCSystem.axml +++ b/bin/Lib/PABCSystem.axml @@ -8,13 +8,39 @@ Стандартные константы \PABCSystem.pas + // Стандартные константы - - const - + + unit + PABCSystem + + + uses + System + . + Runtime + . + InteropServices + , + System + . + IO + , + System + . + Collections + , + System + . + Collections + . + Generic + , + System + MaxShortInt = @@ -71,37 +97,102 @@ . MaxValue - - MinDouble - = - real - . - Epsilon - - - MaxReal - = - real - . - MaxValue - Стандартные типы \PABCSystem.pas - object = System.Object; + // Стандартные типы - - object - = + + + + + unit + PABCSystem + + + uses System . - Object - - - + Runtime + . + InteropServices + , + System + . + IO + , + System + . + Collections + , + System + . + Collections + . + Generic + , + System + + + MaxShortInt + = + shortint + . + MaxValue + + + MaxByte + = + byte + . + MaxValue + + + MaxSmallInt + = + smallint + . + MaxValue + + + MaxWord + = + word + . + MaxValue + + + MaxLongWord + = + longword + . + MaxValue + + + MaxInt64 + = + int64 + . + MaxValue + + + MaxUInt64 + = + uint64 + . + MaxValue + + + MaxDouble + = + real + . + MaxValue + + Классы коллекций @@ -545,12 +636,98 @@ - Подпрограммы ввода read + Процедуры и функции ввода Read \PABCSystem.pas - // read - readln + // Процедуры и функции ввода Read + + + unit + PABCSystem + + + uses + System + . + Runtime + . + InteropServices + , + System + . + IO + , + System + . + Collections + , + System + . + Collections + . + Generic + , + System + + + MaxShortInt + = + shortint + . + MaxValue + + + MaxByte + = + byte + . + MaxValue + + + MaxSmallInt + = + smallint + . + MaxValue + + + MaxWord + = + word + . + MaxValue + + + MaxLongWord + = + longword + . + MaxValue + + + MaxInt64 + = + int64 + . + MaxValue + + + MaxUInt64 + = + uint64 + . + MaxValue + + + MaxDouble + = + real + . + MaxValue + + Ввод из текстового файла @@ -573,12 +750,98 @@ - Процедуры вывода write + Процедуры вывода Write \PABCSystem.pas - // write - writeln + // Процедуры вывода Write - Writeln + + + unit + PABCSystem + + + uses + System + . + Runtime + . + InteropServices + , + System + . + IO + , + System + . + Collections + , + System + . + Collections + . + Generic + , + System + + + MaxShortInt + = + shortint + . + MaxValue + + + MaxByte + = + byte + . + MaxValue + + + MaxSmallInt + = + smallint + . + MaxValue + + + MaxWord + = + word + . + MaxValue + + + MaxLongWord + = + longword + . + MaxValue + + + MaxInt64 + = + int64 + . + MaxValue + + + MaxUInt64 + = + uint64 + . + MaxValue + + + MaxDouble + = + real + . + MaxValue + + @@ -679,23 +942,96 @@ Подпрограммы для работы с текстовыми файлами \PABCSystem.pas - procedure Assign(f: Text; name: string); + // Подпрограммы для работы с текстовыми файлами - - procedure - Assign - ( - f - : - Text - ; - name - : - string - ) - - + + + + unit + PABCSystem + + + uses + System + . + Runtime + . + InteropServices + , + System + . + IO + , + System + . + Collections + , + System + . + Collections + . + Generic + , + System + + + MaxShortInt + = + shortint + . + MaxValue + + + MaxByte + = + byte + . + MaxValue + + + MaxSmallInt + = + smallint + . + MaxValue + + + MaxWord + = + word + . + MaxValue + + + MaxLongWord + = + longword + . + MaxValue + + + MaxInt64 + = + int64 + . + MaxValue + + + MaxUInt64 + = + uint64 + . + MaxValue + + + MaxDouble + = + real + . + MaxValue + + @@ -816,7 +1152,7 @@ - Функции работы со стандартными множествами + Процедуры для работы со стандартными множествами \PABCSystem.pas procedure Include(var s: TypedSet; el: object); @@ -953,7 +1289,7 @@ - П/п для работы с динамическими массивами + Подпрограммы для работы с динамическими массивами \PABCSystem.pas function Low(i: System.Array): integer; @@ -975,9 +1311,9 @@ - П/п для работы с последовательностями и дин. массивами + Подпрограммы для генерации последовательностей \PABCSystem.pas - // Sequences and dynamic arrays + // Подпрограммы для генерации последовательностей @@ -1070,7 +1406,102 @@ - П/п для генерации случайных матриц + Подпрограммы для генерации динамических массивов + \PABCSystem.pas + // Подпрограммы для генерации динамических массивов + + + + + + unit + PABCSystem + + + uses + System + . + Runtime + . + InteropServices + , + System + . + IO + , + System + . + Collections + , + System + . + Collections + . + Generic + , + System + + + MaxShortInt + = + shortint + . + MaxValue + + + MaxByte + = + byte + . + MaxValue + + + MaxSmallInt + = + smallint + . + MaxValue + + + MaxWord + = + word + . + MaxValue + + + MaxLongWord + = + longword + . + MaxValue + + + MaxInt64 + = + int64 + . + MaxValue + + + MaxUInt64 + = + uint64 + . + MaxValue + + + MaxDouble + = + real + . + MaxValue + + + + + + Подпрограммы для генерации случайных матриц \PABCSystem.pas // Matrices @@ -1165,18 +1596,104 @@ - П/п Rec для созданияTuplов + Подпрограммы для создания кортежей \PABCSystem.pas - // Tuples + // Подпрограммы для создания кортежей + + + unit + PABCSystem + + + uses + System + . + Runtime + . + InteropServices + , + System + . + IO + , + System + . + Collections + , + System + . + Collections + . + Generic + , + System + + + MaxShortInt + = + shortint + . + MaxValue + + + MaxByte + = + byte + . + MaxValue + + + MaxSmallInt + = + smallint + . + MaxValue + + + MaxWord + = + word + . + MaxValue + + + MaxLongWord + = + longword + . + MaxValue + + + MaxInt64 + = + int64 + . + MaxValue + + + MaxUInt64 + = + uint64 + . + MaxValue + + + MaxDouble + = + real + . + MaxValue + + - Подпрограммы создания Lst, HSet, SSet, Dict, KV + Короткие функции Lst, HSet, SSet, Dict, KV \PABCSystem.pas - // Lst, HSet, SSet, Dict, KV + // Короткие функции Lst, HSet, SSet, Dict, KV @@ -1271,7 +1788,7 @@ Стандартные классы исключений \PABCSystem.pas - // Standard Exceptions + // Стандартные классы исключений @@ -1366,7 +1883,7 @@ Общедоступные переменные \PABCSystem.pas - // Global variables + // Общедоступные переменные diff --git a/bin/Lib/PABCSystem.pas b/bin/Lib/PABCSystem.pas index 8c03c283e..51072e315 100644 --- a/bin/Lib/PABCSystem.pas +++ b/bin/Lib/PABCSystem.pas @@ -26,6 +26,9 @@ uses System.Collections.Generic, System; +// ----------------------------------------------------- +// Стандартные константы +// ----------------------------------------------------- const /// Максимальное значение типа shortint MaxShortInt = shortint.MaxValue; @@ -53,7 +56,6 @@ const MaxSingle = single.MaxValue; /// Минимальное положительное значение типа single MinSingle = single.Epsilon; - /// Максимальное значение типа integer MaxInt = integer.MaxValue; /// Константа Pi @@ -73,7 +75,7 @@ const __IS_SYSTEM_MODULE = true; // ----------------------------------------------------- -// Standard types +// Стандартные типы // ----------------------------------------------------- type /// Базовый тип объектов @@ -182,7 +184,7 @@ type /// Представляет функцию с одним параметром вещественного типа, возвращающую вещественное RealFunc = Func; - /// Представляет функцию с одним параметром строкового типа, возвращающую строковое + /// Представляет функцию с одним параметром строкового типа, возвращающую строку StringFunc = Func; /// Представляет функцию с одним параметром, возвращающую boolean @@ -215,6 +217,8 @@ type /// Представляет результаты из набора групп при выполнении Regex.Match RegexGroupCollection = System.Text.RegularExpressions.GroupCollection; + /// Представляет тип короткой строки фиксированной длины 255 символов + ShortString = string[255]; //------------------------------------------------------------------------------ //Pointers //------------------------------------------------------------------------------ @@ -242,7 +246,6 @@ type PReal = ^real;//double PDouble = ^double;//double //ошибка, не сохранится, надо исправить //------------------------------------------------------------------------------ - ShortString = string[255]; // ----------------------------------------------------- // IOSystem interface & IOStandardSystem implementation @@ -474,9 +477,9 @@ type end; // ----------------------------------------------------- -// read - readln +// Процедуры и функции ввода Read // ----------------------------------------------------- -///- read(a,b,...) +///- procedure Read(a,b,...); /// Вводит значения a,b,... с клавиатуры procedure Read; ///-- @@ -505,6 +508,9 @@ procedure Read(var x: uint64); procedure Read(var x: single); ///-- procedure Read(var x: boolean); +///- procedure Readln(a,b,...); +/// Вводит значения a,b,... с клавиатуры и осуществляет переход на следующую строку +procedure Readln; /// Возвращает значение типа integer, введенное с клавиатуры function ReadInteger: integer; @@ -539,15 +545,20 @@ function ReadString(prompt: string): string; /// Выводит приглашение к вводу и возвращает значение типа boolean, введенное с клавиатуры function ReadBoolean(prompt: string): boolean; -/// Выводит приглашение к вводу и возвращает значение типа integer, введенное с клавиатуры, и переходит на следующую строку ввода +/// Выводит приглашение к вводу и возвращает значение типа integer, введенное с клавиатуры, +///и осуществляет переход на следующую строку ввода function ReadlnInteger(prompt: string): integer; -/// Выводит приглашение к вводу и возвращает значение типа real, введенное с клавиатуры, и переходит на следующую строку ввода +/// Выводит приглашение к вводу и возвращает значение типа real, введенное с клавиатуры, +///и осуществляет переход на следующую строку ввода function ReadlnReal(prompt: string): real; -/// Выводит приглашение к вводу и возвращает значение типа char, введенное с клавиатуры, и переходит на следующую строку ввода +/// Выводит приглашение к вводу и возвращает значение типа char, введенное с клавиатуры, +///и осуществляет переход на следующую строку ввода function ReadlnChar(prompt: string): char; -/// Выводит приглашение к вводу и возвращает значение типа string, введенное с клавиатуры, и переходит на следующую строку ввода +/// Выводит приглашение к вводу и возвращает значение типа string, введенное с клавиатуры, +///и осуществляет переход на следующую строку ввода function ReadlnString(prompt: string): string; -/// Выводит приглашение к вводу и возвращает значение типа boolean, введенное с клавиатуры, и переходит на следующую строку ввода +/// Выводит приглашение к вводу и возвращает значение типа boolean, введенное с клавиатуры, +///и осуществляет переход на следующую строку ввода function ReadlnBoolean(prompt: string): boolean; @@ -556,12 +567,8 @@ procedure ReadShortString(var s: string; n: integer); ///-- procedure ReadShortStringFromFile(f: Text; var s: string; n: integer); -///- readln(a,b,...) -/// Вводит значения a,b,... с клавиатуры и осуществляет переход на следующую строку -procedure Readln; - -///- read(f,a,b,...) -/// Вводит значения a,b,... из файла f +///- procedure Read(f,a,b,...); +/// Вводит значения a,b,... из текстового файла f procedure Read(f: Text); ///-- procedure Read(f: Text; var x: integer); @@ -607,64 +614,64 @@ function ReadString(f: Text): string; /// Возвращает значение типа boolean, введенное из текстового файла f function ReadBoolean(f: Text): boolean; -/// Возвращает значение типа integer, введенное из текстового файла f, и переходит на следующую строку +/// Возвращает значение типа integer, введенное из текстового файла f, +///и осуществляет переход на следующую строку function ReadlnInteger(f: Text): integer; -/// Возвращает значение типа real, введенное из текстового файла f, и переходит на следующую строку +/// Возвращает значение типа real, введенное из текстового файла f, +///и осуществляет переход на следующую строку function ReadlnReal(f: Text): real; -/// Возвращает значение типа char, введенное из текстового файла f, и переходит на следующую строку +/// Возвращает значение типа char, введенное из текстового файла f, +///и осуществляет переход на следующую строку function ReadlnChar(f: Text): char; -/// Возвращает значение типа string, введенное из текстового файла f, и переходит на следующую строку +/// Возвращает значение типа string, введенное из текстового файла f, +///и осуществляет переход на следующую строку function ReadlnString(f: Text): string; -/// Возвращает значение типа boolean, введенное из текстового файла f, и переходит на следующую строку +/// Возвращает значение типа boolean, введенное из текстового файла f, +///и осуществляет переход на следующую строку function ReadlnBoolean(f: Text): boolean; -/// Возвращает True, если достигнут конец строки -function Eoln: boolean; -/// Возвращает True, если достигнут конец файла -function Eof: boolean; - // ----------------------------------------------------- -// write - writeln +// Процедуры вывода Write // ----------------------------------------------------- -///- write(a,b,...) +///- procedure Write(a,b,...); /// Выводит значения a,b,... на экран -procedure write; +procedure Write; ///-- -procedure write(obj: object); +procedure Write(obj: object); ///-- -procedure write(obj1, obj2: object); +procedure Write(obj1, obj2: object); ///-- -procedure write(params args: array of object); +procedure Write(params args: array of object); -///- writeln(a,b,...) +///- procedure Writeln(a,b,...); /// Выводит значения a,b,... на экран и осуществляет переход на новую строку -///!!- writeln(a,b,...) +///!!- Writeln(a,b,...) /// Writes a,b,... to standart output stream and appends newline -procedure writeln; +procedure Writeln; ///-- -procedure writeln(obj: object); +procedure Writeln(obj: object); ///-- //procedure writeln(ptr: pointer); ///-- -procedure writeln(obj1, obj2: object); +procedure Writeln(obj1, obj2: object); ///-- -procedure writeln(params args: array of object); +procedure Writeln(params args: array of object); -///- write(f: Text; a,b,...) +///- procedure Write(f: Text; a,b,...); /// Выводит значения a,b,... в текстовый файл f -procedure write(f: Text); +procedure Write(f: Text); ///-- -procedure write(f: Text; val: object); +procedure Write(f: Text; val: object); ///-- -procedure write(f: Text; params args: array of object); +procedure Write(f: Text; params args: array of object); -///- writeln(f: Text; a,b,...) +///- procedure Writeln(f: Text; a,b,...); /// Выводит значения a,b,... в текстовый файл f и осуществляет переход на новую строку -procedure writeln(f: Text); +procedure Writeln(f: Text); ///-- -procedure writeln(f: Text; val: object); +procedure Writeln(f: Text; val: object); ///-- -procedure writeln(f: Text; params args: array of object); +procedure Writeln(f: Text; params args: array of object); /// Выводит значения args согласно форматной строке formatstr procedure WriteFormat(formatstr: string; params args: array of object); @@ -679,19 +686,23 @@ procedure WritelnFormat(f: Text; formatstr: string; params args: array of object // ----------------------------------------------------- // Print // ----------------------------------------------------- -/// Выводит значения s на экран +///- procedure Print(a,b,...); +/// Выводит значения a,b,... на экран, после каждого значения выводит пробел procedure Print(s: string); -/// Выводит значения args на экран, выводя после каждого значения пробел +///-- procedure Print(params args: array of object); -/// Выводит значения args на экран, выводя после каждого значения пробел, и переходит на новую строчку -procedure Println(params args: array of object); -/// Выводит значения args в текстовый файл f, выводя после каждого значения пробел +///- procedure Print(f,a,b,...); +/// Выводит значения a,b,... в текстовый файл f, после каждого значения выводит пробел procedure Print(f: Text; params args: array of object); -/// Выводит значения args в текстовый файл f, выводя после каждого значения пробел, и переходит на новую строчку +///- procedure Println(a,b,...); +/// Выводит значения a,b,... на экран, после каждого значения выводит пробел и переходит на новую строку +procedure Println(params args: array of object); +///- procedure Println(f,a,b,...); +/// Выводит значения a,b,... в текстовый файл f, после каждого значения выводит пробел и переходит на новую строку procedure Println(f: Text; params args: array of object); // ----------------------------------------------------- -// Text files subroutines +// Подпрограммы для работы с текстовыми файлами // ----------------------------------------------------- /// Связывает файловую переменную f с именем файла name procedure Assign(f: Text; name: string); @@ -701,41 +712,45 @@ procedure AssignFile(f: Text; name: string); procedure Close(f: Text); /// Закрывает файл f procedure CloseFile(f: Text); -/// Открывает текстовый файл f на чтение +/// Открывает текстовый файл f на чтение в кодировке Windows procedure Reset(f: Text); -/// Открывает текстовый файл f на чтение +/// Открывает текстовый файл f на чтение в указанной кодировке procedure Reset(f: Text; en: Encoding); -/// Связывает файловую переменную f с именем файла name и открывает текстовый файл на чтение +/// Связывает файловую переменную f с именем файла name и открывает текстовый файл на чтение в кодировке Windows procedure Reset(f: Text; name: string); -/// Связывает файловую переменную f с именем файла name и открывает текстовый файл на чтение +/// Связывает файловую переменную f с именем файла name и открывает текстовый файл на чтение в указанной кодировке procedure Reset(f: Text; name: string; en: Encoding); -/// Открывает текстовый файл f на запись, при этом обнуляя его содержимое. Если файл существовал, он обнуляется +/// Открывает текстовый файл f на запись в кодировке Windows. +///Если файл существовал - он обнуляется, если нет - создается пустой procedure Rewrite(f: Text); -/// Открывает текстовый файл f на запись, при этом обнуляя его содержимое. Если файл существовал, он обнуляется +/// Открывает текстовый файл f на запись в указанной кодировке. +///Если файл существовал - он обнуляется, если нет - создается пустой procedure Rewrite(f: Text; en: Encoding); -/// Связывает файловую переменную f с именем файла name и открывает текстовый файл f на запись, при этом обнуляя его содержимое +/// Связывает файловую переменную f с именем файла name и открывает текстовый файл f на запись в кодировке Windows. +///Если файл существовал - он обнуляется, если нет - создается пустой procedure Rewrite(f: Text; name: string); -/// Связывает файловую переменную f с именем файла name и открывает текстовый файл f на запись, при этом обнуляя его содержимое +/// Связывает файловую переменную f с именем файла name и открывает текстовый файл f на запись в указанной кодировке. +///Если файл существовал - он обнуляется, если нет - создается пустой procedure Rewrite(f: Text; name: string; en: Encoding); -/// Открывает текстовый f файл на дополнение +/// Открывает текстовый f файл на дополнение в кодировке Windows procedure Append(f: Text); -/// Открывает текстовый f файл на дополнение +/// Открывает текстовый f файл на дополнение в указанной кодировке procedure Append(f: Text; en: Encoding); -/// Связывает файловую переменную f с именем файла name и открывает текстовый файл на дополнение +/// Связывает файловую переменную f с именем файла name и открывает текстовый файл на дополнение в кодировке Windows procedure Append(f: Text; name: string); -/// Связывает файловую переменную f с именем файла name и открывает текстовый файл на дополнение +/// Связывает файловую переменную f с именем файла name и открывает текстовый файл на дополнение в указанной кодировке procedure Append(f: Text; name: string; en: Encoding); -/// Возвращает текстовый файл с именем fname, открытый на чтение +/// Возвращает текстовый файл с именем fname, открытый на чтение в кодировке Windows function OpenRead(fname: string): Text; -/// Возвращает текстовый файл с именем fname, открытый на чтение +/// Возвращает текстовый файл с именем fname, открытый на чтение в указанной кодировке function OpenRead(fname: string; en: Encoding): Text; -/// Возвращает текстовый файл с именем fname, открытый на запись +/// Возвращает текстовый файл с именем fname, открытый на запись в кодировке Windows function OpenWrite(fname: string): Text; -/// Возвращает текстовый файл с именем fname, открытый на запись +/// Возвращает текстовый файл с именем fname, открытый на запись в указанной кодировке function OpenWrite(fname: string; en: Encoding): Text; -/// Возвращает текстовый файл с именем fname, открытый на дополнение +/// Возвращает текстовый файл с именем fname, открытый на дополнение в кодировке Windows function OpenAppend(fname: string): Text; -/// Возвращает текстовый файл с именем fname, открытый на дополнение +/// Возвращает текстовый файл с именем fname, открытый на дополнение в указанной кодировке function OpenAppend(fname: string; en: Encoding): Text; /// Возвращает True, если достигнут конец файла f @@ -756,84 +771,75 @@ procedure Rename(f: Text; newname: string); ///-- procedure TextFileInit(var f: Text); -/// Считывает строки из файла и превращает их в последовательность строк +/// Открывает файл, считывает из него строки в кодировке Windows и закрывает файл. В каждый момент в памяти хранится только текущая строка function ReadLines(path: string): sequence of string; -/// Считывает строки из файла с кодировкой en и превращает их в последовательность строк +/// Открывает файл, считывает из него строки в указаной кодировке и закрывает файл. В каждый момент в памяти хранится только текущая строка function ReadLines(path: string; en: Encoding): sequence of string; -/// Считывает строки из файла в массив строк +/// Открывает файл, считывает из него строки в кодировке Windows в виде массива строк, после чего закрывает файл function ReadAllLines(path: string): array of string; -/// Считывает строки из файла с кодировкой en в массив строк +/// Открывает файл, считывает из него строки в указаной кодировке в виде массива строк, после чего закрывает файл function ReadAllLines(path: string; en: Encoding): array of string; -/// Считывает содержимое файла в строку +/// Открывает файл, считывает его содержимое в кодировке Windows в виде строки, после чего закрывает файл function ReadAllText(path: string): string; -/// Считывает содержимое файла с кодировкой en в строку +/// Открывает файл, считывает его содержимое в указаной кодировке в виде строки, после чего закрывает файл function ReadAllText(path: string; en: Encoding): string; -/// Создает новый файл, записывает в него строки из последовательности +/// Создает новый файл, записывает в него строки из последовательности в кодировке Windows, после чего закрывает файл procedure WriteLines(path: string; ss: sequence of string); -/// Создает новый файл с кодировкой en, записывает в него строки из последовательности +/// Создает новый файл, записывает в него строки из последовательности в указанной кодировке, после чего закрывает файл procedure WriteLines(path: string; ss: sequence of string; en: Encoding); -/// Создает новый файл, записывает в него строки из массива +/// Создает новый файл, записывает в него строки из массива в кодировке Windows, после чего закрывает файл procedure WriteAllLines(path: string; ss: array of string); -/// Создает новый файл с кодировкой en, записывает в него строки из массива +/// Создает новый файл, записывает в него строки из массива в указанной кодировке, после чего закрывает файл procedure WriteAllLines(path: string; ss: array of string; en: Encoding); -/// Создает новый файл, записывает в него содержимое строки +/// Создает новый файл, записывает в него строку в кодировке Windows, после чего закрывает файл procedure WriteAllText(path: string; s: string); -/// Создает новый файл с кодировкой en, записывает в него содержимое строки +/// Создает новый файл, записывает в него строку в указанной кодировке, после чего закрывает файл procedure WriteAllText(path: string; s: string; en: Encoding); -/// Возвращает последовательность имен файлов по заданному пути, соответствующих шаблону поиска -function EnumerateFiles(path: string; searchPattern: string := '*.*'): sequence of string; -/// Возвращает последовательность имен файлов по заданному пути, соответствующих шаблону поиска, включая подкаталоги -function EnumerateAllFiles(path: string; searchPattern: string := '*.*'): sequence of string; -/// Возвращает последовательность имен каталогов по заданному пути -function EnumerateDirectories(path: string): sequence of string; -/// Возвращает последовательность имен каталогов по заданному пути, включая подкаталоги -function EnumerateAllDirectories(path: string): sequence of string; - // ----------------------------------------------------- -// Abstract binary files subroutines +// Подпрограммы для работы с двоичными файлами // ----------------------------------------------------- -///- Assign(f: file of T; name: string) +///- procedure Assign(f: file of T; name: string); /// Связывает файловую переменную f с именем файла name procedure Assign(f: AbstractBinaryFile; name: string); -///- AssignFile(f: file of T; name: string) +///- procedure AssignFile(f: file of T; name: string); /// Связывает файловую переменную f с именем файла name procedure AssignFile(f: AbstractBinaryFile; name: string); -///- Close(f: file of T) +///- procedure Close(f: file of T); /// Закрывает файл f procedure Close(f: AbstractBinaryFile); -///- CloseFile(f: file of T) +///- procedure CloseFile(f: file of T); /// Закрывает файл f procedure CloseFile(f: AbstractBinaryFile); -///- Reset(f: file of T) +///- procedure Reset(f: file of T); /// Открывает двоичный файл f на чтение и запись procedure Reset(f: AbstractBinaryFile); -///- Reset(f: file of T; name: string) +///- procedure Reset(f: file of T; name: string); /// Связывает файловую переменную f с именем файла name и открывает двоичный файл f на чтение и запись procedure Reset(f: AbstractBinaryFile; name: string); -///- Rewrite(f: file of T) +///- procedure Rewrite(f: file of T); /// Открывает двоичный файл f на чтение и запись, при этом обнуляя его содержимое. Если файл существовал, он обнуляется procedure Rewrite(f: AbstractBinaryFile); -///- Rewrite(f: file of T) +///- procedure Rewrite(f: file of T); /// Связывает файловую переменную f с именем файла name и открывает двоичный файл на чтение и запись, при этом обнуляя его содержимое procedure Rewrite(f: AbstractBinaryFile; name: string); -///- Truncate(f: file of T) +///- procedure Truncate(f: file of T); /// Усекает двоичный файл f, отбрасывая все элементы с позиции файлового указателя procedure Truncate(f: AbstractBinaryFile); -///- Eof(f: file of T) +///- function Eof(f: file of T): boolean; /// Возвращает True, если достигнут конец файла f function Eof(f: AbstractBinaryFile): boolean; -///- Erase(f: file of T) +///- procedure Erase(f: file of T); /// Удаляет файл, связанный с файловой переменной f procedure Erase(f: AbstractBinaryFile); -///- Rename(f: file of T; newname: string) +///- procedure Rename(f: file of T; newname: string); /// Переименовывает файл, связаный с файловой переменной f, давая ему имя newname. procedure Rename(f: AbstractBinaryFile; newname: string); ///- write(f: file of T; a,b,...) /// Выводит значения a,b,... в типизированный файл f //procedure Write(f: AbstractBinaryFile; val: object; arr: boolean); -///- write(f: file; a,b,...) +///- procedure Write(f: file; a,b,...); /// Выводит значения a,b,... в нетипизированный файл f procedure Write(f: AbstractBinaryFile; params vals: array of object); ///-- @@ -844,15 +850,15 @@ procedure Writeln(f: AbstractBinaryFile; val: object); procedure Writeln(f: AbstractBinaryFile; params vals: array of object); // ----------------------------------------------------- -// Typed files subroutines +// Подпрограммы для работы с типизированными файлами // ----------------------------------------------------- -///- FilePos(f : file of T): int64 +///- function FilePos(f: file of T): int64; /// Возвращает текущую позицию файлового указателя в типизированном файле f function FilePos(f: TypedFile): int64; -///- FileSize(f : file of T): int64 +///- function FileSize(f: file of T): int64; /// Возвращает количество элементов в типизированном файле f function FileSize(f: TypedFile): int64; -///- Seek(f : file of T; n : int64) +///- procedure Seek(f: file of T; n: int64); /// Устанавливает текущую позицию файлового указателя в типизированном файле f на элемент с номером n procedure Seek(f: TypedFile; n: int64); ///-- @@ -865,15 +871,15 @@ procedure TypedFileInitWithShortString(var f: TypedFile; ElementType: System.Typ function TypedFileRead(f: TypedFile): object; // ----------------------------------------------------- -// Binary files subroutines +// Подпрограммы для работы с бестиповыми файлами // ----------------------------------------------------- -///- FilePos(f : file): int64 +///- function FilePos(f: file): int64; /// Возвращает текущую позицию файлового указателя в нетипизированном файле f function FilePos(f: BinaryFile): int64; -///- FileSize(f : file): int64 +///- function FileSize(f: file): int64; /// Возвращает количество байт в нетипизированном файле f function FileSize(f: BinaryFile): int64; -///- Seek(f : file; n : int64) +///- procedure Seek(f: file; n: int64); /// Устанавливает текущую позицию файлового указателя в нетипизированном файле f на байт с номером n procedure Seek(f: BinaryFile; n: int64); ///-- @@ -882,7 +888,7 @@ procedure BinaryFileInit(var f: BinaryFile); function BinaryFileRead(var f: BinaryFile; ElementType: System.Type): object; // ----------------------------------------------------- -// Operating System subroutines +// Cистемные подпрограммы // ----------------------------------------------------- /// Возвращает количество параметров командной строки function ParamCount: integer; @@ -954,8 +960,17 @@ procedure Execute(filename: string); /// Запускает программу или документ с именем filename и параметрами командной строки args procedure Execute(filename: string; args: string); +/// Возвращает последовательность имен файлов по заданному пути, соответствующих шаблону поиска +function EnumerateFiles(path: string; searchPattern: string := '*.*'): sequence of string; +/// Возвращает последовательность имен файлов по заданному пути, соответствующих шаблону поиска, включая подкаталоги +function EnumerateAllFiles(path: string; searchPattern: string := '*.*'): sequence of string; +/// Возвращает последовательность имен каталогов по заданному пути +function EnumerateDirectories(path: string): sequence of string; +/// Возвращает последовательность имен каталогов по заданному пути, включая подкаталоги +function EnumerateAllDirectories(path: string): sequence of string; + // ----------------------------------------------------- -// File name functions +// Функции для работы с именами файлов // ----------------------------------------------------- /// Выделяет имя файла из полного имени файла fname function ExtractFileName(fname: string): string; @@ -971,7 +986,7 @@ function ExtractFileDrive(fname: string): string; function ExpandFileName(fname: string): string; // ----------------------------------------------------- -// Mathematical functions +// Математические подпрограммы // ----------------------------------------------------- ///-function Sign(x: число): число; /// Возвращает знак числа x @@ -1150,36 +1165,25 @@ function Odd(i: uint64): boolean; function Cplx(re,im: real): Complex; // ----------------------------------------------------- -// Typed sets +// Процедуры для работы со стандартными множествами // ----------------------------------------------------- -///- Include(var s : set of T; el : T) +///- procedure Include(var s: set of T; element: T); ///Добавляет елемент el во множество s procedure Include(var s: TypedSet; el: object); -///- Exclude(var s : set of T; el : T) +///- procedure Exclude(var s: set of T; element: T); ///Удаляет элемент el из множества s procedure Exclude(var s: TypedSet; el: object); // ----------------------------------------------------- -// Char and String subroutines +// Подпрограммы для работы с символами и строками // ----------------------------------------------------- /// Преобразует код в символ в кодировке Windows function ChrAnsi(a: byte): char; /// Преобразует символ в код в кодировке Windows function OrdAnsi(a: char): byte; -///-function Ord(a: целое): целое; -/// Возвращает порядковый номер значения a -function Ord(a: integer): integer; -///-- -function Ord(a: longword): longword; -///-- -function Ord(a: int64): int64; -///-- -function Ord(a: uint64): uint64; -///-- -function Ord(a: boolean): integer; -/// Преобразует код в символ +/// Преобразует код в символ в кодировке Unicode function Chr(a: word): char; -/// Преобразует символ в код +/// Преобразует символ в код в кодировке Unicode function Ord(a: char): word; /// Преобразует код в символ в кодировке Unicode function ChrUnicode(a: word): char; @@ -1194,6 +1198,7 @@ function UpCase(ch: char): char; /// Преобразует символ в нижний регистр function LowCase(ch: char): char; +///-procedure Str(i: целое; var s: string); /// Преобразует целое значение i к строковому представлению и записывает результат в s procedure Str(i: integer; var s: string); ///-- @@ -1209,7 +1214,7 @@ procedure Str(r: single; var s: string); ///-- procedure Str(s1: string; var s: string); /// Возвращает позицию подстроки subs в строке s. Если не найдена, возвращает 0 -function Pos(subs, s: string): integer; +function Pos(subs, s: string; from: integer := 1): integer; /// Возвращает позицию подстроки subs в строке s начиная с позиции from. Если не найдена, возвращает 0 function PosEx(subs, s: string; from: integer := 1): integer; /// Возвращает длину строки @@ -1226,7 +1231,7 @@ procedure InsertInShortString(source: string; var s: string; index, n: integer); procedure Delete(var s: string; index, count: integer); /// Возвращает подстроку строки s длины count с позиции index function Copy(s: string; index, count: integer): string; -///-Concat(s1,s2,...): string +///-function Concat(s1,s2,...): string; /// Возвращает строку, являющуюся результатом слияния строк s1,s2,... function Concat(params strs: array of string): string; /// Возвращает строку, являющуюся результатом слияния строк s1 и s2 @@ -1259,13 +1264,17 @@ function StrToInt(s: string): integer; function StrToInt64(s: string): int64; /// Преобразует строковое представление вещественного числа к числовому значению function StrToFloat(s: string): real; -/// Преобразует строковое представление s целого числа к числовому значению и записывает его в value. При невозможности преобразования возвращается False +/// Преобразует строковое представление s целого числа к числовому значению и записывает его в value. +///При невозможности преобразования возвращается False function TryStrToInt(s: string; var value: integer): boolean; -/// Преобразует строковое представление s целого числа к числовому значению и записывает его в value. При невозможности преобразования возвращается False +/// Преобразует строковое представление s целого числа к числовому значению и записывает его в value. +///При невозможности преобразования возвращается False function TryStrToInt64(s: string; var value: int64): boolean; -/// Преобразует строковое представление s вещественного числа к числовому значению и записывает его в value. При невозможности преобразования возвращается False +/// Преобразует строковое представление s вещественного числа к числовому значению и записывает его в value. +///При невозможности преобразования возвращается False function TryStrToFloat(s: string; var value: real): boolean; -/// Преобразует строковое представление s вещественного числа к числовому значению и записывает его в value. При невозможности преобразования возвращается False +/// Преобразует строковое представление s вещественного числа к числовому значению и записывает его в value. +///При невозможности преобразования возвращается False function TryStrToFloat(s: string; var value: single): boolean; /// Считывает целое из строки function ReadIntegerFromString(s: string; var from: integer): integer; @@ -1280,25 +1289,27 @@ function TryReadIntegerFromString(s: string; var from: integer; var res: integer /// Считывает вещественное из строки. Возвращает True если считывание удачно и False в противном случае function TryReadRealFromString(s: string; var from: integer; var res: real): boolean; -/// Преобразует строковое представление s целого числа к числовому значению и записывает его в переменную value. Если преобразование успешно, то err=0, иначе err>0 +///-procedure Val(s: string; var value: число; var err: integer); +/// Преобразует строковое представление s целого числа к числовому значению и записывает его в переменную value. +///Если преобразование успешно, то err=0, иначе err>0 procedure Val(s: string; var value: integer; var err: integer); -/// Преобразует строковое представление s целого числа к числовому значению и записывает его в переменную value. Если преобразование успешно, то err=0, иначе err>0 +///-- procedure Val(s: string; var value: shortint; var err: integer); -/// Преобразует строковое представление s целого числа к числовому значению и записывает его в переменную value. Если преобразование успешно, то err=0, иначе err>0 +///-- procedure Val(s: string; var value: smallint; var err: integer); -/// Преобразует строковое представление s целого числа к числовому значению и записывает его в переменную value. Если преобразование успешно, то err=0, иначе err>0 +///-- procedure Val(s: string; var value: int64; var err: integer); -/// Преобразует строковое представление s целого числа к числовому значению и записывает его в переменную value. Если преобразование успешно, то err=0, иначе err>0 +///-- procedure Val(s: string; var value: byte; var err: integer); -/// Преобразует строковое представление s целого числа к числовому значению и записывает его в переменную value. Если преобразование успешно, то err=0, иначе err>0 +///-- procedure Val(s: string; var value: word; var err: integer); -/// Преобразует строковое представление s целого числа к числовому значению и записывает его в переменную value. Если преобразование успешно, то err=0, иначе err>0 +///-- procedure Val(s: string; var value: longword; var err: integer); -/// Преобразует строковое представление s целого числа к числовому значению и записывает его в переменную value. Если преобразование успешно, то err=0, иначе err>0 +///-- procedure Val(s: string; var value: uint64; var err: integer); -/// Преобразует строковое представление s вещественного числа к числовому значению и записывает его в переменную value. Если преобразование успешно, то err=0, иначе err>0 +///-- procedure Val(s: string; var value: real; var err: integer); -/// Преобразует строковое представление s вещественного числа к числовому значению и записывает его в переменную value. Если преобразование успешно, то err=0, иначе err>0 +///-- procedure Val(s: string; var value: single; var err: integer); /// Преобразует целое число к строковому представлению @@ -1308,11 +1319,11 @@ function IntToStr(a: int64): string; /// Преобразует вещественное число к строковому представлению function FloatToStr(a: real): string; -/// Возвращает отформатированную строку, построенную по форматной строке fmtstr и списку форматиуемых параметров pars -function Format(fmtstr: string; params pars: array of object): string; +/// Возвращает отформатированную строку, построенную по форматной строке и списку форматируемых параметров +function Format(formatstring: string; params pars: array of object): string; // ----------------------------------------------------- -// Common Routines +// Общие подпрограммы // ----------------------------------------------------- /// Увеличивает значение переменной i на 1 procedure Inc(var i: integer); @@ -1340,66 +1351,84 @@ procedure Dec(var b: byte); procedure Dec(var b: byte; n: integer); procedure Inc(var f: boolean); procedure Dec(var f: boolean); +///-function Ord(a: целое): целое; +/// Возвращает порядковый номер значения a +function Ord(a: integer): integer; +///-- +function Ord(a: longword): longword; +///-- +function Ord(a: int64): int64; +///-- +function Ord(a: uint64): uint64; +///-- +function Ord(a: boolean): integer; -//------------------------------------------------------------------------------ -//PRED-SUCC +///-function Succ(x: целое): целое; /// Возвращает следующее за x значение -function succ(x: integer): integer; -/// Возвращает следующее за x значение -function succ(x: boolean): boolean; -/// Возвращает следующее за x значение -function succ(x: byte): byte; -/// Возвращает следующее за x значение -function succ(x: shortint): shortint; -/// Возвращает следующее за x значение -function succ(x: smallint): smallint; -/// Возвращает следующее за x значение -function succ(x: word): word; -/// Возвращает следующее за x значение -function succ(x: longword): longword; -/// Возвращает следующее за x значение -function succ(x: int64): int64; -/// Возвращает следующее за x значение -function succ(x: uint64): uint64; -/// Возвращает следующее за x значение -function succ(x: char): char; +function Succ(x: integer): integer; +///-- +function Succ(x: byte): byte; +///-- +function Succ(x: shortint): shortint; +///-- +function Succ(x: smallint): smallint; +///-- +function Succ(x: word): word; +///-- +function Succ(x: longword): longword; +///-- +function Succ(x: int64): int64; +///-- +function Succ(x: uint64): uint64; +///-function Succ(x: char): char; +/// Возвращает следующий за x символ +function Succ(x: char): char; +///-- +function Succ(x: boolean): boolean; + +///-function Pred(x); /// Возвращает предшествующее x значение -function pred(x: boolean): boolean; -/// Возвращает предшествующее x значение -function pred(x: byte): byte; -/// Возвращает предшествующее x значение -function pred(x: shortint): shortint; -/// Возвращает предшествующее x значение -function pred(x: smallint): smallint; -/// Возвращает предшествующее x значение -function pred(x: word): word; -/// Возвращает предшествующее x значение -function pred(x: integer): integer; -/// Возвращает предшествующее x значение -function pred(x: longword): longword; -/// Возвращает предшествующее x значение -function pred(x: int64): int64; -/// Возвращает предшествующее x значение -function pred(x: uint64): uint64; -/// Возвращает предшествующее x значение -function pred(x: char): char; +function Pred(x: integer): integer; +///-- +function Pred(x: byte): byte; +///-- +function Pred(x: shortint): shortint; +///-- +function Pred(x: smallint): smallint; +///-- +function Pred(x: word): word; +///-- +function Pred(x: longword): longword; +///-- +function Pred(x: int64): int64; +///-- +function Pred(x: uint64): uint64; +///-function Pred(x: char): char; +/// Возвращает предшествующий x символ +function Pred(x: char): char; +///-- +function Pred(x: boolean): boolean; /// Меняет местами значения двух переменных procedure Swap(var a, b: T); +/// Возвращает True, если достигнут конец строки +function Eoln: boolean; +/// Возвращает True, если достигнут конец потока ввода +function Eof: boolean; // ----------------------------------------------------- -// Dynamic arrays +// Подпрограммы для работы с динамическими массивами // ----------------------------------------------------- -///- Low(i: array): integer +///- function Low(i: array): integer; function Low(i: System.Array): integer; -///- High(i: array): integer +///- function High(i: array): integer; function High(i: System.Array): integer; /// Возвращает длину динамического массива -function Length(a: &Array): integer; +function Length(a: System.Array): integer; /// Возвращает длину динамического массива по размерности dim -function Length(a: &Array; dim: integer): integer; +function Length(a: System.Array; dim: integer): integer; /// Создаёт копию динамического массива -function Copy(a: &Array): &Array; +function Copy(a: System.Array): System.Array; /// Сортирует динамический массив по возрастанию procedure Sort(a: array of T); /// Сортирует список по возрастанию @@ -1410,7 +1439,7 @@ procedure Reverse(a: array of T); procedure Reverse(a: array of T; index,length: integer); // ----------------------------------------------------- -// Sequences and dynamic arrays +// Подпрограммы для генерации последовательностей // ----------------------------------------------------- /// Возвращает последовательность целых от a до b function Range(a,b: integer): sequence of integer; @@ -1420,61 +1449,32 @@ function Range(c1,c2: char): sequence of char; function Range(a,b: real; n: integer): sequence of real; /// Возвращает последовательность целых от a до b с шагом step function Range(a,b,step: integer): sequence of integer; -/// Возвращает массив размера n, заполненный случайными целыми значениями -function ArrRandom(n: integer := 10; a: integer := 0; b: integer := 100): array of integer; -/// Возвращает массив размера n, заполненный случайными целыми значениями -function ArrRandomInteger(n: integer := 10; a: integer := 0; b: integer := 100): array of integer; -/// Возвращает массив размера n, заполненный случайными вещественными значениями -function ArrRandomReal(n: integer := 10; a: real := 0; b: real := 10): array of real; -/// Возвращает последовательность из n случайных целых элементов -function SeqRandom(n: integer := 10; a: integer := 0; b: integer := 100): sequence of integer; -/// Возвращает последовательность из n случайных вещественных элементов -function SeqRandomReal(n: integer := 10; a: real := 0; b: real := 10): sequence of real; -/// Возвращает массив, заполненный указанными значениями -function Arr(params a: array of T): array of T; -/// Возвращает массив, заполненный значениями из последовательнсти -function Arr(a: sequence of T): array of T; /// Возвращает последовательность указанных элементов function Seq(params a: array of T): sequence of T; -/// Возвращает массив из count элементов, заполненных значениями f(i) -function ArrGen(count: integer; f: integer -> T): array of T; -/// Возвращает массив из count элементов, заполненных значениями f(i), начиная с i=from -function ArrGen(count: integer; f: integer -> T; from: integer): array of T; -/// Возвращает массив из count элементов, начинающихся с first, с функцией next перехода от предыдущего к следующему -function ArrGen(count: integer; first: T; next: T -> T): array of T; -/// Возвращает массив из count элементов, начинающихся с first и second, с функцией next перехода от двух предыдущих к следующему -function ArrGen(count: integer; first,second: T; next: (T,T) -> T): array of T; +/// Возвращает последовательность из n случайных целых элементов +function SeqRandom(n: integer := 10; a: integer := 0; b: integer := 100): sequence of integer; +/// Возвращает последовательность из n случайных целых элементов +function SeqRandomInteger(n: integer := 10; a: integer := 0; b: integer := 100): sequence of integer; +/// Возвращает последовательность из n случайных вещественных элементов +function SeqRandomReal(n: integer := 10; a: real := 0; b: real := 10): sequence of real; /// Возвращает последовательность из count элементов, заполненных значениями f(i) function SeqGen(count: integer; f: integer -> T): sequence of T; /// Возвращает последовательность из count элементов, заполненных значениями f(i), начиная с i=from function SeqGen(count: integer; f: integer -> T; from: integer): sequence of T; /// Возвращает последовательность из count элементов, начинающуюся с first, с функцией next перехода от предыдущего к следующему function SeqGen(count: integer; first: T; next: T -> T): sequence of T; -/// Возвращает последовательность из count элементов, начинающуюся с first и second, с функцией next перехода от двух предыдущих к следующему +/// Возвращает последовательность из count элементов, начинающуюся с first и second, +///с функцией next перехода от двух предыдущих к следующему function SeqGen(count: integer; first,second: T; next: (T,T) -> T): sequence of T; -/// Возвращает последовательность элементов с начальным значением first, функцией next перехода от предыдущего к следующему и условием pred продолжения последовательности +/// Возвращает последовательность элементов с начальным значением first, +///функцией next перехода от предыдущего к следующему и условием pred продолжения последовательности function SeqWhile(first: T; next: T -> T; pred: T -> boolean): sequence of T; -/// Возвращает последовательность элементов, начинающуюся с first и second, с функцией next перехода от двух предыдущих к следующему и условием pred продолжения последовательности +/// Возвращает последовательность элементов, начинающуюся с first и second, +///с функцией next перехода от двух предыдущих к следующему и условием pred продолжения последовательности function SeqWhile(first,second: T; next: (T,T) -> T; pred: T -> boolean): sequence of T; -/// Возвращает массив из count элементов x -function ArrFill(count: integer; x: T): array of T; /// Возвращает последовательность из count элементов x function SeqFill(count: integer; x: T): sequence of T; -/// Возвращает массив из n целых, введенных с клавиатуры -function ReadArrInteger(n: integer): array of integer; -/// Возвращает массив из n вещественных, введенных с клавиатуры -function ReadArrReal(n: integer): array of real; -/// Возвращает массив из n строк, введенных с клавиатуры -function ReadArrString(n: integer): array of string; - -/// Выводит приглашение к вводу и возвращает массив из n целых, введенных с клавиатуры -function ReadArrInteger(const prompt: string; n: integer): array of integer; -/// Выводит приглашение к вводу и возвращает массив из n вещественных, введенных с клавиатуры -function ReadArrReal(const prompt: string; n: integer): array of real; -/// Выводит приглашение к вводу и возвращает массив из n строк, введенных с клавиатуры -function ReadArrString(const prompt: string; n: integer): array of string; - /// Возвращает последовательность из n целых, введенных с клавиатуры function ReadSeqInteger(n: integer): sequence of integer; /// Возвращает последовательность из n вещественных, введенных с клавиатуры @@ -1489,16 +1489,55 @@ function ReadSeqReal(const prompt: string; n: integer): sequence of real; /// Выводит приглашение к вводу и возвращает последовательность из n строк, введенных с клавиатуры function ReadSeqString(const prompt: string; n: integer): sequence of string; + // ----------------------------------------------------- -// Matrices +// Подпрограммы для генерации динамических массивов // ----------------------------------------------------- -/// Возвращает матрицу размера m x n, заполненную случайными целыми значениями +/// Возвращает массив, заполненный указанными значениями +function Arr(params a: array of T): array of T; +/// Возвращает массив, заполненный значениями из последовательнсти +function Arr(a: sequence of T): array of T; +/// Возвращает массив размера n, заполненный случайными целыми значениями +function ArrRandom(n: integer := 10; a: integer := 0; b: integer := 100): array of integer; +/// Возвращает массив размера n, заполненный случайными целыми значениями +function ArrRandomInteger(n: integer := 10; a: integer := 0; b: integer := 100): array of integer; +/// Возвращает массив размера n, заполненный случайными вещественными значениями +function ArrRandomReal(n: integer := 10; a: real := 0; b: real := 10): array of real; +/// Возвращает массив из count элементов, заполненных значениями f(i) +function ArrGen(count: integer; f: integer -> T): array of T; +/// Возвращает массив из count элементов, заполненных значениями f(i), начиная с i=from +function ArrGen(count: integer; f: integer -> T; from: integer): array of T; +/// Возвращает массив из count элементов, начинающихся с first, с функцией next перехода от предыдущего к следующему +function ArrGen(count: integer; first: T; next: T -> T): array of T; +/// Возвращает массив из count элементов, начинающихся с first и second, с функцией next перехода от двух предыдущих к следующему +function ArrGen(count: integer; first,second: T; next: (T,T) -> T): array of T; +/// Возвращает массив из count элементов x +function ArrFill(count: integer; x: T): array of T; + +/// Возвращает массив из n целых, введенных с клавиатуры +function ReadArrInteger(n: integer): array of integer; +/// Возвращает массив из n вещественных, введенных с клавиатуры +function ReadArrReal(n: integer): array of real; +/// Возвращает массив из n строк, введенных с клавиатуры +function ReadArrString(n: integer): array of string; + +/// Выводит приглашение к вводу и возвращает массив из n целых, введенных с клавиатуры +function ReadArrInteger(const prompt: string; n: integer): array of integer; +/// Выводит приглашение к вводу и возвращает массив из n вещественных, введенных с клавиатуры +function ReadArrReal(const prompt: string; n: integer): array of real; +/// Выводит приглашение к вводу и возвращает массив из n строк, введенных с клавиатуры +function ReadArrString(const prompt: string; n: integer): array of string; + +// ----------------------------------------------------- +// Подпрограммы для генерации случайных матриц +// ----------------------------------------------------- +/// Возвращает двумерный массив размера m x n, заполненный случайными целыми значениями function MatrixRandom(m: integer := 5; n: integer := 5; a: integer := 0; b: integer := 100): array [,] of integer; -/// Возвращает матрицу размера m x n, заполненную случайными вещественными значениями +/// Возвращает двумерный массив размера m x n, заполненный случайными вещественными значениями function MatrixRandomReal(m: integer := 5; n: integer := 5; a: real := 0; b: real := 10): array [,] of real; // ----------------------------------------------------- -// Tuples +// Подпрограммы для создания кортежей // ----------------------------------------------------- ///- function Rec(x1: T1, x2: T2,...): (T1,T2,...); /// Возвращает кортеж из элементов разных типов @@ -1515,7 +1554,7 @@ function Rec(x1: T1; x2: T2; x3: T3; x4: T4; x5: T5; x6: T6): function Rec(x1: T1; x2: T2; x3: T3; x4: T4; x5: T5; x6: T6; x7: T7): (T1,T2,T3,T4,T5,T6,T7); // ----------------------------------------------------- -// Lst, HSet, SSet, Dict, KV +// Короткие функции Lst, HSet, SSet, Dict, KV // ----------------------------------------------------- /// Возвращает список, заполненный указанными значениями function Lst(params a: array of T): List; @@ -1536,7 +1575,7 @@ function KV(key: TKey; value: TVal): KeyValuePair; // ----------------------------------------------------- -// Standard Exceptions +// Стандартные классы исключений // ----------------------------------------------------- type ///Базовый класс для исключений, бросаемых при создании инстанции generic-типа @@ -1570,12 +1609,8 @@ type // ----------------------------------------------------- -// Global variables +// Общедоступные переменные // ----------------------------------------------------- -///-- -var - __CONFIG__: Dictionary := new Dictionary; - var /// Содержит аргумены командой строки, с которыми была запущена программа CommandLineArgs: array of string; @@ -1597,6 +1632,9 @@ var ///-- DefaultEncoding: Encoding; +///-- +var + __CONFIG__: Dictionary := new Dictionary; // Вспомогательные подпрограммы. Из раздела интерфейса не убирать!!! // ----------------------------------------------------- @@ -3563,6 +3601,11 @@ begin Result := Range(1,n).Select(i->Random(a,b)) end; +function SeqRandomInteger(n: integer; a: integer; b: integer): sequence of integer; +begin + Result := Range(1,n).Select(i->Random(a,b)) +end; + function SeqRandomReal(n: integer; a: real; b: real): sequence of real; begin Result := Range(1,n).Select(i->Random()*(b-a)+a) @@ -4201,7 +4244,7 @@ begin end; // ----------------------------------------------------- -// read - readln +// Read - Readln // ----------------------------------------------------- procedure read; begin @@ -5568,29 +5611,6 @@ begin System.IO.File.WriteAllText(path,s,en); end; -// ----------------------------------------------------- -// EnumerateFiles, EnumerateDirectories -// ----------------------------------------------------- -function EnumerateFiles(path: string; searchPattern: string): sequence of string; -begin - Result := System.IO.Directory.EnumerateFiles(path,searchPattern,System.IO.SearchOption.TopDirectoryOnly) -end; - -function EnumerateAllFiles(path: string; searchPattern: string): sequence of string; -begin - Result := System.IO.Directory.EnumerateFiles(path,searchPattern,System.IO.SearchOption.AllDirectories) -end; - -function EnumerateDirectories(path: string): sequence of string; -begin - Result := System.IO.Directory.EnumerateDirectories(path,'*.*',System.IO.SearchOption.TopDirectoryOnly) -end; - -function EnumerateAllDirectories(path: string): sequence of string; -begin - Result := System.IO.Directory.EnumerateDirectories(path,'*.*',System.IO.SearchOption.AllDirectories) -end; - // ----------------------------------------------------- // Abstract binary files // ----------------------------------------------------- @@ -6293,6 +6313,29 @@ begin System.Diagnostics.Process.Start(filename, args) end; +// ----------------------------------------------------- +// EnumerateFiles, EnumerateDirectories +// ----------------------------------------------------- +function EnumerateFiles(path: string; searchPattern: string): sequence of string; +begin + Result := System.IO.Directory.EnumerateFiles(path,searchPattern,System.IO.SearchOption.TopDirectoryOnly) +end; + +function EnumerateAllFiles(path: string; searchPattern: string): sequence of string; +begin + Result := System.IO.Directory.EnumerateFiles(path,searchPattern,System.IO.SearchOption.AllDirectories) +end; + +function EnumerateDirectories(path: string): sequence of string; +begin + Result := System.IO.Directory.EnumerateDirectories(path,'*.*',System.IO.SearchOption.TopDirectoryOnly) +end; + +function EnumerateAllDirectories(path: string): sequence of string; +begin + Result := System.IO.Directory.EnumerateDirectories(path,'*.*',System.IO.SearchOption.AllDirectories) +end; + // ----------------------------------------------------- // File name functions: implementation // ----------------------------------------------------- @@ -6990,16 +7033,18 @@ begin s := Convert.ToString(r, nfi); end; -function Pos(subs, s: string): integer; +function Pos(subs, s: string; from: integer): integer; begin if (subs = nil) or (subs.Length = 0) then Result := 0 - else Result := s.IndexOf(subs) + 1; + else Result := s.IndexOf(subs, from - 1) + 1; end; function PosEx(subs, s: string; from: integer): integer; begin - Result := s.IndexOf(subs, from - 1) + 1; + if (subs = nil) or (subs.Length = 0) then + Result := 0 + else Result := s.IndexOf(subs, from - 1) + 1; end; function Length(s: string): integer; @@ -7500,10 +7545,10 @@ begin Result := a.ToString(nfi); end; -function Format(fmtstr: string; params pars: array of object): string; +function Format(formatstring: string; params pars: array of object): string; begin try - Result := string.Format(nfi, fmtstr, pars); + Result := string.Format(nfi, formatstring, pars); except on e: Exception do raise e;