From eb5237b465e39822e5bbf2e8c44da4bbef68879e Mon Sep 17 00:00:00 2001 From: miks1965 Date: Sat, 15 Aug 2015 00:31:26 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BDPT4Linq=20=D0=BA=20=D1=81=D0=B0=D0=BD=D0=B4=D0=B0=D1=80?= =?UTF-8?q?=D1=82=D0=BD=D1=8B=D0=BC=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8F?= =?UTF-8?q?=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Configuration/GlobalAssemblyInfo.cs | 2 +- Configuration/Version.defs | 2 +- Errors/Errors.cs | 6 +- ReleaseGenerators/PascalABCNET_version.nsh | 2 +- ReleaseGenerators/RebuildStandartModules.pas | 2 +- ReleaseGenerators/sect_Core.nsh | 4 + SyntaxTree/tree/NodesBuilder.cs | 2 +- SyntaxTree/tree/TreeHelper.cs | 199 +++++++++++++++--- .../ParsePABC1/ProcessYieldsCapturedVars.cs | 62 ++++-- _ParsePABC1/ParsePABC1/Program.cs | 8 +- _ParsePABC1/yield2.pas | 2 +- bin/Lib/PABCRtl.dll | Bin 479744 -> 479744 bytes bin/Lib/PT4Linq.pas | 67 ++++++ 13 files changed, 301 insertions(+), 57 deletions(-) create mode 100644 bin/Lib/PT4Linq.pas diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index 221908ab5..85e2176ac 100644 --- a/Configuration/GlobalAssemblyInfo.cs +++ b/Configuration/GlobalAssemblyInfo.cs @@ -15,7 +15,7 @@ internal static class RevisionClass public const string Major = "2"; public const string Minor = "2"; public const string Build = "0"; - public const string Revision = "1008"; + public const string Revision = "1010"; 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 958e68b46..61dc36f90 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ %MINOR%=2 -%REVISION%=1008 +%REVISION%=1010 %MAJOR%=2 %COREVERSION%=0 diff --git a/Errors/Errors.cs b/Errors/Errors.cs index a764d4663..3a0746669 100644 --- a/Errors/Errors.cs +++ b/Errors/Errors.cs @@ -1,4 +1,4 @@ -// Copyright (c) Ivan Bondarev, Stanislav Mihalkovich (for details please see \doc\copyright.txt) +// Copyright (c) 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) using System; using System.IO; @@ -55,7 +55,7 @@ namespace PascalABCCompiler.Errors fn = Path.GetFileName(FileName); return string.Format(StringResources.Get("PARSER_ERRORS_COMPILATION_ERROR{0}{1}{2}"), fn, pos, Message); */ - return (new CompilerInternalError("Errors.ToString",new Exception(string.Format(" {0}.ToString",this.GetType())))).ToString(); + return (new CompilerInternalError("Errors.ToString",new Exception(string.Format("Не переопеределена {0}.ToString",this.GetType())))).ToString(); } public virtual SourceLocation SourceLocation @@ -167,7 +167,7 @@ namespace PascalABCCompiler.Errors pos = "(?,?)"; else pos = "(" + source_context.begin_position.line_num + "," + source_context.begin_position.column_num + ")"; - return Path.GetFileName(FileName) + pos + ": : " + Message + snode; + return Path.GetFileName(FileName) + pos + ": Синтаксическая ошибка : " + Message + snode; } public override SourceContext SourceContext diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index fa65140f7..99e2d6e7e 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '2.2.0.1008' \ No newline at end of file +!define VERSION '2.2.0.1010' \ No newline at end of file diff --git a/ReleaseGenerators/RebuildStandartModules.pas b/ReleaseGenerators/RebuildStandartModules.pas index ad94146f7..fbd1ffdd1 100644 --- a/ReleaseGenerators/RebuildStandartModules.pas +++ b/ReleaseGenerators/RebuildStandartModules.pas @@ -4,7 +4,7 @@ uses DrawManField, Events, FilesOperations, GOLDParserEngine, GraphABC, GraphABCHelper, IniFile, PointerTools, PointRect, PT4, Robot, RobotField, RobotTaskMaker, RobotZadan, Sockets, Utils, VCL, Timers, PT4Exam, PT4TaskMakerNET, RBDMUtils, - Collections, Arrays, Core, FormsABC, MPI; + Collections, Arrays, Core, FormsABC, MPI, PT4Linq; begin writeln(cos(pi)); diff --git a/ReleaseGenerators/sect_Core.nsh b/ReleaseGenerators/sect_Core.nsh index f8e416dff..d396680f5 100644 --- a/ReleaseGenerators/sect_Core.nsh +++ b/ReleaseGenerators/sect_Core.nsh @@ -91,6 +91,7 @@ File ..\bin\Lib\Utils.pcu File ..\bin\Lib\VCL.pcu File ..\bin\Lib\PT4Exam.pcu + File ..\bin\Lib\PT4Linq.pcu File ..\bin\Lib\PT4TaskMakerNET.pcu File ..\bin\Lib\RBDMUtils.pcu File ..\bin\Lib\Collections.pcu @@ -135,6 +136,7 @@ ${AddFile} "VCL.pcu" ${AddFile} "PT4TaskMakerNET.pcu" ${AddFile} "PT4Exam.pcu" + ${AddFile} "PT4Linq.pcu" ${AddFile} "RBDMUtils.pcu" ${AddFile} "Collections.pcu" ${AddFile} "Core.pcu" @@ -172,6 +174,7 @@ File ..\bin\Lib\PointRect.pas File ..\bin\Lib\PT4.pas File ..\bin\Lib\PT4Exam.pas + File ..\bin\Lib\PT4Linq.pas File ..\bin\Lib\Robot.pas File ..\bin\Lib\RobotField.pas File ..\bin\Lib\RobotTaskMaker.pas @@ -216,6 +219,7 @@ ${AddFile} "PointRect.pas" ${AddFile} "PT4.pas" ${AddFile} "PT4Exam.pas" + ${AddFile} "PT4Linq.pas" ${AddFile} "Robot.pas" ${AddFile} "RobotField.pas" ${AddFile} "RobotTaskMaker.pas" diff --git a/SyntaxTree/tree/NodesBuilder.cs b/SyntaxTree/tree/NodesBuilder.cs index 047d0c058..d46e1810b 100644 --- a/SyntaxTree/tree/NodesBuilder.cs +++ b/SyntaxTree/tree/NodesBuilder.cs @@ -239,7 +239,7 @@ namespace PascalABCCompiler.SyntaxTree { var pal = new procedure_attributes_list(proc_attribute.attr_override); var fp = new formal_parameters(); - var ff = new function_header(fp, pal, "ToString", "string"); + var ff = new function_header("ToString", "string", fp, pal); var cleft = new char_const('('); var cright = new char_const(')'); diff --git a/SyntaxTree/tree/TreeHelper.cs b/SyntaxTree/tree/TreeHelper.cs index c28f85ced..0be34ef99 100644 --- a/SyntaxTree/tree/TreeHelper.cs +++ b/SyntaxTree/tree/TreeHelper.cs @@ -86,12 +86,8 @@ namespace PascalABCCompiler.SyntaxTree //-- List members begin public List list { - get - { - return subnodes; - } + get { return subnodes; } } - public void AddMany(params statement[] els) { list.AddRange(els); @@ -141,6 +137,10 @@ namespace PascalABCCompiler.SyntaxTree { list.InsertRange(0, els); } + public static statement_list Empty + { + get { return new statement_list(); } + } //-- List members end } @@ -162,6 +162,14 @@ namespace PascalABCCompiler.SyntaxTree { } public assign(string name, expression ex, SourceContext sc = null) : this(new ident(name), ex, sc) { } + public assign(string name, string id) : this(new ident(name), new ident(id)) + { } + public assign(string name, int value) : this(new ident(name), new int32_const(value)) + { } + public assign(string name, double value) : this(new ident(name), new double_const(value)) + { } + public assign(string name, char value) : this(new ident(name), new char_const(value)) + { } public override string ToString() { return string.Format("{0} {1} {2}", to, OperatorServices.ToString(operator_type, LanguageId.PascalABCNET), from); @@ -374,6 +382,9 @@ namespace PascalABCCompiler.SyntaxTree public var_def_statement(ident id, type_definition type) : this(new ident_list(id), type) { } + public var_def_statement(ident id, string type) : this(new ident_list(id), new named_type_reference(type)) + { } + public override string ToString() { var sb = new System.Text.StringBuilder(); @@ -399,7 +410,6 @@ namespace PascalABCCompiler.SyntaxTree { Add(_declaration, sc); } - public declarations Add(declaration _declaration, SourceContext sc = null) { defs.Add(_declaration); @@ -407,33 +417,66 @@ namespace PascalABCCompiler.SyntaxTree source_context = sc; return this; } - public void AddMany(params declaration[] ids) - { - defs.AddRange(ids); - } - public bool Remove(declaration st) + //-- List members begin + public List list { - return defs.Remove(st); + get { return defs; } } - public void InsertAfter(declaration st, declaration newst) + public void AddMany(params declaration[] els) { - var ind = defs.FindIndex(x => x == st); + list.AddRange(els); + } + public bool Remove(declaration el) + { + return list.Remove(el); + } + private int FindIndex(declaration el) + { + var ind = list.FindIndex(x => x == el); if (ind == -1) - throw new Exception(string.Format("У {0} не найден {1} среди дочерних\n", this, st)); - defs.Insert(ind + 1, newst); + throw new Exception(string.Format("У списка {0} не найден элемент {1} среди дочерних\n", this, el)); + return ind; } - public void InsertBefore(declaration st, declaration newst) + public void Replace(declaration el, declaration newel) { - var ind = defs.FindIndex(x => x == st); - if (ind == -1) - throw new Exception(string.Format("У {0} не найден {1} среди дочерних\n", this, st)); - defs.Insert(ind, newst); + list[FindIndex(el)] = newel; } - public void AddFirst(ident st) + public void Replace(declaration el, IEnumerable newels) { - defs.Insert(0, st); + var ind = FindIndex(el); + list.RemoveAt(ind); + list.InsertRange(ind, newels); } + public void InsertAfter(declaration el, declaration newel) + { + list.Insert(FindIndex(el) + 1, newel); + } + public void InsertBefore(declaration el, declaration newel) + { + list.Insert(FindIndex(el), newel); + } + public void InsertAfter(declaration el, IEnumerable newels) + { + list.InsertRange(FindIndex(el) + 1, newels); + } + public void InsertBefore(declaration el, IEnumerable newels) + { + list.InsertRange(FindIndex(el), newels); + } + public void AddFirst(declaration el) + { + list.Insert(0, el); + } + public void AddFirst(IEnumerable els) + { + list.InsertRange(0, els); + } + public static statement_list Empty + { + get { return new statement_list(); } + } + //-- List members end } public partial class program_tree @@ -480,6 +523,10 @@ namespace PascalABCCompiler.SyntaxTree source_context = sc; return this; } + public static expression_list Empty + { + get { return new expression_list(); } + } public override string ToString() { if (expressions.Count == 0) @@ -551,6 +598,13 @@ namespace PascalABCCompiler.SyntaxTree { } public typed_parameters(ident id, type_definition type): this(new ident_list(id), type) { } + public override string ToString() + { + var s = this.idents.ToString() + ": " + this.vars_type.ToString(); + if (this.inital_value != null) + s += " := " + this.inital_value.ToString(); + return s; + } } public partial class formal_parameters @@ -566,8 +620,16 @@ namespace PascalABCCompiler.SyntaxTree source_context = sc; return this; } + public override string ToString() + { + return string.Join(",", params_list.Select(p => p.ToString())); + } + public static formal_parameters Empty + { + get { return new formal_parameters(); } + } } -/// + /// public partial class procedure_attributes_list { public procedure_attributes_list(procedure_attribute _procedure_attribute, SourceContext sc = null) @@ -607,6 +669,16 @@ namespace PascalABCCompiler.SyntaxTree } } + //for sugar + public procedure_header(string name, formal_parameters fp, procedure_attributes_list pal) : this(fp, pal, new method_name(name), null, null) + { } + + public procedure_header(string name, formal_parameters fp) : this(name, fp, new procedure_attributes_list()) + { } + + public procedure_header(string name) : this(name, new formal_parameters()) + { } + public override string ToString() { var sb = new System.Text.StringBuilder(); @@ -632,9 +704,14 @@ namespace PascalABCCompiler.SyntaxTree } //for sugar - public function_header(formal_parameters fp, procedure_attributes_list pal, string name, string returntype) : this(fp, pal, new method_name(name), null, new named_type_reference(returntype), null) - { - } + public function_header(string name, string returntype, formal_parameters fp, procedure_attributes_list pal) : this(fp, pal, new method_name(name), null, new named_type_reference(returntype), null) + { } + + public function_header(string name, string returntype, formal_parameters fp) : this(fp, new procedure_attributes_list(), new method_name(name), null, new named_type_reference(returntype), null) + { } + + public function_header(string name, string returntype) : this(new formal_parameters(), new procedure_attributes_list(), new method_name(name), null, new named_type_reference(returntype), null) + { } public override string ToString() { @@ -664,6 +741,49 @@ namespace PascalABCCompiler.SyntaxTree source_context = null; is_short_definition = false; } + + public procedure_definition(string name, formal_parameters fp, declarations defs, statement_list code) : this(new procedure_header(name,fp), new block(defs, code)) + { } + + public procedure_definition(string name, formal_parameters fp, statement_list code) : this(new procedure_header(name, fp), new block(null, code)) + { } + + public procedure_definition(string name, formal_parameters fp, statement st) : this(new procedure_header(name, fp), new block(null, new statement_list(st))) + { } + + public procedure_definition(string name, declarations defs, statement_list code) : this(new procedure_header(name), new block(defs, code)) + { } + + public procedure_definition(string name, statement_list code, proc_block b) : this(new procedure_header(name), b) + { } + + public procedure_definition(string name, statement_list code) : this(new procedure_header(name), new block(null, code)) + { } + + public procedure_definition(string name, statement st) : this(new procedure_header(name), new block(null, new statement_list(st))) + { } + + public procedure_definition(string name, string rettype, formal_parameters fp, declarations defs, statement_list code) : this(new function_header(name, rettype, fp), new block(defs, code)) + { } + + public procedure_definition(string name, string rettype, formal_parameters fp, statement_list code) : this(new function_header(name, rettype, fp), new block(null, code)) + { } + + public procedure_definition(string name, string rettype, formal_parameters fp, statement st) : this(new function_header(name, rettype, fp), new block(null, new statement_list(st))) + { } + + public procedure_definition(string name, string rettype, declarations defs, statement_list code) : this(new function_header(name, rettype), new block(defs, code)) + { } + + public procedure_definition(string name, string rettype, proc_block b) : this(new function_header(name, rettype), b) + { } + + public procedure_definition(string name, string rettype, statement_list code) : this(new function_header(name, rettype), new block(null, code)) + { } + + public procedure_definition(string name, string rettype, statement st) : this(new function_header(name, rettype), new block(null, new statement_list(st))) + { } + public void AssignAttrList(attribute_list al) { if (proc_header != null) @@ -833,13 +953,18 @@ namespace PascalABCCompiler.SyntaxTree { access_mod = new access_modifer_node(access); } - public class_members Add(declaration _declaration, SourceContext sc = null) + public class_members Add(declaration _declaration, SourceContext sc) { members.Add(_declaration); if (sc != null) source_context = sc; return this; } + public void Add(params declaration[] decls) + { + foreach (var d in decls) + members.Add(d); + } } public partial class class_body @@ -938,12 +1063,26 @@ namespace PascalABCCompiler.SyntaxTree { public constructor(formal_parameters fp, SourceContext sc = null) : this(null, fp, new procedure_attributes_list(), null, false, false, null, null, sc) { } + public override string ToString() + { + var sb = new System.Text.StringBuilder(); + sb.Append("constructor "); + + sb.Append("(" + parameters.ToString() + ")"); + sb.Append(";"); + return sb.ToString(); + } } public partial class block { public block(statement_list code) : this(null, code, null) { } + + public static block Empty + { + get { return new block(null, new statement_list()); } + } } public partial class case_variants @@ -1101,6 +1240,10 @@ namespace PascalABCCompiler.SyntaxTree { public new_expr(type_definition type, expression_list pars, SourceContext sc = null) : this(type, pars, false, null, sc) { } + public override string ToString() + { + return "new "+this.type.ToString()+"("+this.params_list.ToString()+")"; + } } public partial class where_type_specificator_list diff --git a/_ParsePABC1/ParsePABC1/ProcessYieldsCapturedVars.cs b/_ParsePABC1/ParsePABC1/ProcessYieldsCapturedVars.cs index 87ecaef69..576eac12c 100644 --- a/_ParsePABC1/ParsePABC1/ProcessYieldsCapturedVars.cs +++ b/_ParsePABC1/ParsePABC1/ProcessYieldsCapturedVars.cs @@ -7,6 +7,10 @@ using System.Threading.Tasks; using PascalABCCompiler; using PascalABCCompiler.SyntaxTree; +using PascalABCCompiler.ParserTools; +using PascalABCCompiler.Errors; + + namespace ParsePABC1 { class ProcessYieldCapturedVarsVisitor : BaseChangeVisitor @@ -30,11 +34,6 @@ namespace ParsePABC1 //PrintInfo = false; } - /*public override void visit(procedure_definition pd) - { - - } */ - public override void Enter(syntax_tree_node st) { base.Enter(st); @@ -49,35 +48,62 @@ namespace ParsePABC1 type_declaration GenClassForYield(procedure_definition pd, IEnumerable fields) { - var fh = (pd.proc_header as function_header); - var seqt = fh.return_type as sequence_type; - var stels = seqt.elements_type; // Теперь на месте процедуры генерируем класс var cm = new class_members(access_modifer.public_modifer); foreach (var m in fields) cm.Add(m); - var st = SyntaxTreeBuilder.BuildSimpleVarDef("state", "integer"); + var st = new var_def_statement("state", "integer"); + + var fh = (pd.proc_header as function_header); + var seqt = fh.return_type as sequence_type; + if (seqt == null) + throw new SyntaxError("Functions with yields must return sequences", "", fh.return_type.source_context, fh.return_type); + + var pars = fh.parameters; + foreach (var ps in pars.params_list) + { + if (ps.param_kind != parametr_kind.none) + throw new SyntaxError("Parameters of functions with yields must not have 'var', 'const' or 'params' modifier", "", pars.source_context, pars); + if (ps.inital_value != null) + throw new SyntaxError("Parameters of functions with yields must not have initial values", "", pars.source_context, pars); + var_def_statement vds = new var_def_statement(ps.idents, ps.vars_type); + cm.Add(vds); + } + + var stels = seqt.elements_type; var cur = new var_def_statement("current", stels); - var pb = pd.proc_body; - var fhh = new function_header(new formal_parameters(),new procedure_attributes_list(),"MoveNext","boolean"); - var MoveNext = new procedure_definition(fhh, pb); + var Constr = new procedure_definition(new constructor(formal_parameters.Empty), block.Empty, null); + + var MoveNext = new procedure_definition("MoveNext", "boolean", pd.proc_body); + + var Reset = new procedure_definition("Reset", statement_list.Empty); + + var GetCurrent = new procedure_definition("get_Current", "object", new assign("Result", "current")); + + var className = newClassName() + "Helper"; + var assG = new assign("Result", new new_expr(new named_type_reference(className),expression_list.Empty)); + var GetEnumerator = new procedure_definition("GetEnumerator", "System.Collections.IEnumerator", assG); + + pd.proc_body = new block(new statement_list(assG)); + + cm.Add(st, cur, Constr, Reset, MoveNext, GetCurrent, GetEnumerator); - cm.Add(st).Add(cur).Add(MoveNext); var interfaces = new named_type_reference_list("System.Collections.IEnumerator","System.Collections.IEnumerable"); - var td = new type_declaration(newClassName()+"Helper", SyntaxTreeBuilder.BuildClassDefinition(interfaces, cm)); + var td = new type_declaration(className, SyntaxTreeBuilder.BuildClassDefinition(interfaces, cm)); return td; } public override void visit(procedure_definition pd) { hasYields = false; - mids = new FindMainIdentsVisitor(); + if (pd.proc_header is function_header) + mids = new FindMainIdentsVisitor(); base.visit(pd); - if (!hasYields) // т.е. мы разобрали процедуру и уже выходим. Это значит, что пока yield будет обрабатываться только в процедурах. Так это и надо. + if (!hasYields) // т.е. мы разобрали функцию и уже выходим. Это значит, что пока yield будет обрабатываться только в функциях. Так это и надо. return; var dld = new DeleteLocalDefs(mids.vars); // mids.vars - все захваченные переменные @@ -89,7 +115,8 @@ namespace ParsePABC1 var cc = GenClassForYield(pd, dld.BlockDeletedIds.Union(dld.LocalDeletedIds)); var cct = new type_declarations(cc); - Replace(pd, cct); + var decls = UpperNodeAs(); + decls.InsertBefore(pd, cct); mids = null; // вдруг мы выйдем из процедуры, не зайдем в другую, а там - оператор! Такого конечно не может быть } @@ -99,6 +126,7 @@ namespace ParsePABC1 hasYields = true; if (mids != null) // если мы - внутри процедуры yn.visit(mids); + else throw new SyntaxError("Yield must be in functions only", "", yn.source_context, yn); // mids.vars - надо установить, какие из них - локальные, какие - из этого класса, какие - являются параметрами функции, а какие - глобальные (все остальные) // те, которые являются параметрами, надо скопировать в локальные переменные и переименовать использование везде по ходу данной функции // самое сложное - переменные-поля этого класса - они требуют в создаваемом классе, реализующем итератор, хранить Self текущего класса и добавлять это Self везде по ходу алгоритма diff --git a/_ParsePABC1/ParsePABC1/Program.cs b/_ParsePABC1/ParsePABC1/Program.cs index 003f2ddec..77ec3fc60 100644 --- a/_ParsePABC1/ParsePABC1/Program.cs +++ b/_ParsePABC1/ParsePABC1/Program.cs @@ -21,11 +21,13 @@ namespace ParsePABC1 var txt = System.IO.File.ReadAllText(fname); - var cu = c.ParsersController.Compile(fname, txt, err, PascalABCCompiler.Parsers.ParseMode.ForFormatter); + var cu = c.ParseText(fname, txt, err); if (cu == null) { - WriteLine("Не распарсилось"); + if (err.Count > 0) + WriteLine(err[0]); + else WriteLine("Не распарсилось"); } return cu; } @@ -34,7 +36,7 @@ namespace ParsePABC1 { try { - var cu = ParseFile(@"d:\w5\yield2.pas"); + var cu = ParseFile(@"..\..\..\yield2.pas"); if (cu == null) return; diff --git a/_ParsePABC1/yield2.pas b/_ParsePABC1/yield2.pas index 303043563..75a695b76 100644 --- a/_ParsePABC1/yield2.pas +++ b/_ParsePABC1/yield2.pas @@ -2,7 +2,7 @@ type A = class j,k: integer; end; -function Gen: sequence of integer; +function Gen(a,b: real): sequence of integer; var j,k: real; begin var i := 1; diff --git a/bin/Lib/PABCRtl.dll b/bin/Lib/PABCRtl.dll index 480f3264626b5f7251ca47cb03534af140f9aefc..7c2c83f74ad867ae0fbf0d75739bdc9a5cd59a5a 100644 GIT binary patch delta 201 zcmV;)05<=Cq#b~y9gv6vZ(Poii%kQodk2Brh1&sz+XA)Q1E7e1{B`hhh0Ogb6+Lq_ z8#gNzYnN?Sqa4RMZ;jKm31Nn}03KuKPw6S3U)E%CWYb3&zK`uDX9J zkWw$ACxpFn}hVTIoSo|d;H!Uo)r DB<*As delta 201 zcmV;)05<=Cq#b~y9gv6v(w)nZi%kRb1qgxLh1&sz+XA)Q1E7e10;zdLRn71qAE-D| zsop<&bv(l4C&;8$f)E67Z`dI)rl=`RPlx~6Ni;88Y|$Hf=4I3gjYrx%;V0RP2CpRq zR8}>^-5r`<#rC_mMF;!2iA%5Nz@QWxzB{X1OFWI^;(MbCcYMjm8#hziyD1f-Z!lBm z`lKA?U^VLo;Bwf9`iTRF`iTUG`iTX%`iTY_I1r4V(W+4g5=5L{LXZ8+C; +begin + result := Range(1, GetInteger()).Select(e -> GetInteger()).ToArray(); +end; + +function ReadSeqString(): IEnumerable; +begin + result := Range(1, GetInteger()).Select(e -> GetString()).ToArray(); +end; + +procedure System.Collections.Generic.IEnumerable.Write(); +begin + var b := self.ToArray(); + PT4.Put(b.Length); + foreach e : T in b do + PT4.Put(e); +end; + +function System.Collections.Generic.IEnumerable.Show + (cmt: string; selector: System.Func): + System.Collections.Generic.IEnumerable; +begin + var b := self.Select(selector).ToArray(); + PT4.Show(cmt); + PT4.Show((b.Length + ':').PadLeft(3)); + foreach var e in b do + PT4.Show(e); + PT4.ShowLine(); + result := self; +end; + +function System.Collections.Generic.IEnumerable.Show + (selector: System.Func): + System.Collections.Generic.IEnumerable; +begin + result := self.Show('', selector); +end; + +function System.Collections.Generic.IEnumerable.Show(cmt: string): + System.Collections.Generic.IEnumerable; +begin + result := self.Show(cmt, e -> e.ToString()); +end; + +function System.Collections.Generic.IEnumerable.Show(): + System.Collections.Generic.IEnumerable; +begin + result := self.Show(''); +end; + +function ReadAllLines(name: string): + System.Collections.Generic.IEnumerable; +begin + result := System.IO.File.ReadAllLines(name, Encoding.Default); +end; + +procedure WriteAllLines(name: string; seq: + System.Collections.Generic.IEnumerable); +begin + System.IO.File.WriteAllLines(name, seq.ToArray, Encoding.Default); +end; + +end. \ No newline at end of file