diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index f4ad00cc3..6a54a5a38 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 = "1286"; + public const string Revision = "1288"; 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 6ff2fb5da..0f3b455cc 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ %MINOR%=1 -%REVISION%=1286 +%REVISION%=1288 %COREVERSION%=0 %MAJOR%=3 diff --git a/PascalABCNET.axml b/PascalABCNET.axml index 451b2e884..93a3f9c16 100644 --- a/PascalABCNET.axml +++ b/PascalABCNET.axml @@ -1,10 +1,10 @@ - + - + - + \treeconverter\treeconversion\syntax_tree_visitor.cs public override void visit(SyntaxTree.indexer _indexer) @@ -15,7 +15,7 @@ - + \treeconverter\treeconversion\syntax_tree_visitor.cs private void indexer_as_expression_index(expression_node expr, SyntaxTree.expression_list parameters, @@ -26,7 +26,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs public override void visit(SyntaxTree.semantic_expr_node sen) @@ -37,7 +37,7 @@ - + \treeconverter\treeconversion\syntax_tree_visitor.cs var fh = (_procedure_definition.proc_header as SyntaxTree.function_header); @@ -50,9 +50,9 @@ - + - + \treeconverter\treeconversion\syntax_tree_visitor.cs public override void visit(SyntaxTree.assign_tuple _modern_proc_type) @@ -63,7 +63,7 @@ - + \treeconverter\treeconversion\syntax_tree_visitor.cs if (t.FullName.StartsWith("System.Tuple")) @@ -76,9 +76,9 @@ - + - + \treeconverter\treeconversion\syntax_tree_visitor.cs public override void visit(SyntaxTree.enum_type_definition _enum_type_definition) @@ -89,7 +89,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs if (!is_enum) @@ -100,7 +100,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs public override void visit(SyntaxTree.modern_proc_type _modern_proc_type) @@ -113,9 +113,9 @@ - + - + \treeconverter\symboltable\dsst\symboltable.cs int tn=HashTable.Find(Name); //найдем имя в хеше @@ -126,7 +126,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs public override void visit(SyntaxTree.modern_proc_type _modern_proc_type) @@ -139,9 +139,9 @@ - + - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs public override void visit(SyntaxTree.foreach_stmt _foreach_stmt) @@ -152,7 +152,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs public bool FindIEnumerableElementType(SyntaxTree.foreach_stmt _foreach_stmt, type_node tn, ref type_node elem_type) @@ -163,7 +163,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs if (tn is compiled_type_node || tn is compiled_generic_instance_type_node) // Если этот тип зашит в .NET @@ -176,9 +176,9 @@ - + - + \treeconverter\lambdaexpressions\lambdaresulttypeinferrer.cs private type_node GetMostCommonType(int kind = 0) @@ -189,7 +189,7 @@ - + \treeconverter\treeconversion\syntax_tree_visitor.cs // SSM 20.07.13 если это - узел с коротким определением функции без типа возвращаемого значения, то вывести этот тип @@ -200,7 +200,7 @@ - + \SyntaxTree\tree\TreeHelper.cs public object RealSemTypeOfResExpr = null; // Result := ex; - семантический тип ex - нужно для лучщего выбора среди перегруженных методов с параметрами-лямбдами @@ -211,7 +211,7 @@ - + \codecompletion\expressionvisitor.cs public override void visit ( assign _assign ) @@ -221,7 +221,7 @@ - + \treeconverter\treeconversion\lambdahelper.cs public class ResultNodesSearcher : SyntaxTree.WalkingVisitorNew @@ -237,7 +237,7 @@ public override void visit ( assign value ) - + \TreeConverter\LambdaExpressions\LambdaResultTypeInferrer.cs internal class LambdaResultTypeInferrer : WalkingVisitorNew @@ -259,7 +259,7 @@ public override void visit ( var_def_statement varStmt ) - + \treeconverter\treeconversion\lambdahelper.cs retType.real_type = new LambdaResultTypeInferrer(funcHeader, procBody, visitor).InferResultType(); @@ -272,7 +272,7 @@ - + \treeconverter\treeconversion\syntax_tree_visitor.cs visit_lambda_header(_procedure_definition.proc_header as SyntaxTree.function_header, _procedure_definition.proc_body); @@ -283,7 +283,7 @@ - + \treeconverter\treeconversion\syntax_tree_visitor.cs hard_node_test_and_visit(_procedure_definition.proc_body); @@ -294,7 +294,7 @@ - + \treeconverter\treeconversion\syntax_tree_visitor.cs hard_node_test_and_visit(_procedure_definition.proc_header); @@ -305,7 +305,7 @@ - + \treeconverter\treeconversion\syntax_tree_visitor.cs if (context.top_function.return_value_type == null) @@ -316,7 +316,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs if (context.top_function.return_value_type == null) @@ -329,9 +329,9 @@ - + - + \treeconverter\treeconversion\syntax_tree_visitor.cs public override void visit(SyntaxTree.question_colon_expression node) @@ -342,7 +342,7 @@ - + \treeconverter\treeconversion\syntax_tree_visitor.cs private void dot_node_as_expression_dot_ident(expression_node en, SyntaxTree.ident id_right, motivation mot, addressed_value syntax_node) @@ -353,7 +353,7 @@ - + \treeconverter\treeconversion\syntax_tree_visitor.cs public override void visit(SyntaxTree.indexer _indexer) @@ -364,7 +364,7 @@ - + \parsers\pascalabcparsernewsaushkin\semanticrules.cs public expression NewVariable(addressed_value variable, expression var_specifiers, LexLocation loc) @@ -377,9 +377,9 @@ - + - + \treeconverter\treeconversion\convertion_data_and_alghoritms.cs public function_node select_function(expressions_list parameters, SymbolInfo functions, location loc, List<SyntaxTree.expression> syntax_nodes_parameters = null) @@ -390,7 +390,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs internal void visit_method_call(SyntaxTree.method_call _method_call) @@ -401,7 +401,7 @@ - + \treeconverter\treeconversion\convertion_data_and_alghoritms.cs function_node inst = generic_convertions.DeduceFunction(func, parameters, @@ -414,9 +414,9 @@ - + - + \treeconverter\treeconversion\syntax_tree_visitor.cs public override void visit(SyntaxTree.procedure_definition _procedure_definition) @@ -427,7 +427,7 @@ - + \treeconverter\treeconversion\syntax_tree_visitor.cs if (ttt is undefined_type) @@ -438,7 +438,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs // SSM 12/04/16 - short func definitions - calc return_value_type @@ -451,9 +451,9 @@ - + - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs public override void visit ( SyntaxTree . function_lambda_definition _function_lambda_definition ) @@ -463,7 +463,7 @@ - + \TreeConverter\TreeConversion\LambdaHelper.cs public static void InferTypesFromVarStmt(type_node leftType, function_lambda_definition lambdaDef, syntax_tree_visitor visitor) @@ -474,7 +474,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs public override void visit(SyntaxTree.assign _assign) @@ -485,7 +485,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs public override void visit(SyntaxTree.var_def_statement _var_def_statement) @@ -496,7 +496,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs MaybeConvertFunctionLambdaDefinitionToProcedureLambdaDefinition(fld1); @@ -507,7 +507,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs LambdaHelper.InferTypesFromVarStmt(tn, _var_def_statement.inital_value as SyntaxTree.function_lambda_definition, this); //lroman// @@ -518,7 +518,7 @@ - + \TreeConverter\TreeConversion\LambdaHelper.cs //throw new SimpleSemanticError(visitor.get_location(lambdaDef), "UNABLE_TO_CONVERT_FUNCTIONAL_TYPE_TO_PROCEDURAL_TYPE"); @@ -529,7 +529,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs AddError(loc, "FUNCTION_EXPECTED_PROCEDURE_{0}_MEET", fn); @@ -540,9 +540,9 @@ - + - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs private base_function_call create_not_static_method_call(function_node fn, expression_node en, location loc, bool procedure_allowed) @@ -557,9 +557,9 @@ - + - + \Compiler\Compiler.cs CurrentUnit.SyntaxTree = syntaxTreeConvertersController.Convert(CurrentUnit.SyntaxTree) as SyntaxTree.compilation_unit; @@ -570,7 +570,7 @@ - + \Compiler\SemanticTreeConverters\SemanticTreeConvertersController.cs public class SemanticTreeConvertersController @@ -592,7 +592,7 @@ public SemanticTree . IProgramNode Convert ( SemanticTree . IProgramNode ProgramNode ) - + \Compiler\Compiler.cs public SyntaxTreeConvertersController SyntaxTreeConvertersController @@ -603,7 +603,7 @@ - + \Compiler\SyntaxTreeConvertersController\SyntaxTreeConvertersController.cs foreach (ISyntaxTreeConverter SyntaxTreeConverter in syntaxTreeConverters) @@ -616,9 +616,9 @@ - + - + \codecompletion\domconverter.cs if (pattern != null || pattern != "") @@ -629,7 +629,7 @@ - + \visualplugins\languageconverter\source\textformatter.cs _word.Replace(specSymbol, ""); @@ -640,7 +640,7 @@ - + \visualpascalabcnet\formsdesignerbinding\dependecies\src\main\base\project\src\services\refactoringservice\refactoringservice.cs result.OrderBy(node => node.Content.FullyQualifiedName); @@ -651,9 +651,9 @@ - + - + \treeconverter\treeconversion\syntax_tree_visitor.cs if (_pascal_set_constant.values != null && _pascal_set_constant.values != null) @@ -664,7 +664,7 @@ - + \visualpascalabcnet\workbench\runnermanagerhandlers.cs if (File.Exists(pdbFileName) && File.Exists(pdbFileName)) @@ -675,7 +675,7 @@ - + \visualpascalabcnet\formsdesignerbinding\dependecies\src\main\base\project\src\editor\codecompletion\nrefactoryinsightwindowhandler.cs Вот здесь то место, где не учитывается один вариант открывающих скобок Вместо одного из openBracketToken нужно написать openBracesToken @@ -690,9 +690,9 @@ - + - + \treeconverter\systemlib\static_executors.cs if (value >= int.MinValue && value <= int.MaxValue) @@ -703,7 +703,7 @@ - + \treeconverter\systemlib\static_executors.cs if (value >= long.MinValue && value <= long.MaxValue) @@ -714,7 +714,7 @@ - + \NETGenerator\NETGenerator.cs if (pos <= 255) il.Emit(OpCodes.Starg_S, pos); @@ -725,7 +725,7 @@ - + \NETGenerator\NETGenerator.cs if (pos <= 255) il.Emit(OpCodes.Starg_S, pos); @@ -736,7 +736,7 @@ - + \NETGenerator\NETGenerator.cs if (pos <= 255) il.Emit(OpCodes.Ldarga_S, pos); @@ -749,7 +749,7 @@ - + \codecompletion\findreferences.cs Двумя строчками ниже (Здесь сказывается недостаток моего инструмента - если в методе есть две одинаковые строчки - переход осуществляется только на первую, а надо на вторую) @@ -762,7 +762,7 @@ - + \parsertools\syntaxtreevisitors\syntaxtreecomparer.cs 597 и 631 строки в текущей версии else if (left is int64_const) @@ -774,7 +774,7 @@ - + \parsertools\syntaxtreevisitors\syntaxtreecomparer.cs 1599 1611 @@ -790,9 +790,9 @@ - + - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs expression_node bfcint = make_read_call(si, _method_call.parameters, subloc2); @@ -803,7 +803,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs private expression_node make_read_call ( SymbolInfo si , SyntaxTree . expression_list parameters , location loc ) @@ -813,7 +813,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs Это - непонятное место из-за которого происходит ошибка readln_string_file = true; @@ -825,7 +825,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs if (!readln_string_file) @@ -838,7 +838,7 @@ - + \treeconverter\treeconversion\syntax_tree_visitor.cs visit_program_code(_block.program_code); @@ -849,7 +849,7 @@ - + \treeconverter\treeconversion\syntax_tree_visitor.cs if (lab.is_defined) @@ -860,9 +860,9 @@ - + - + \SyntaxVisitors\YieldVisitors\ProcessYieldsCapturedVars.cs public override void visit(procedure_definition pd) @@ -873,7 +873,7 @@ - + \Yield\YieldConversionSyntax\YieldDesugarSyntaxTreeConverter.cs root.visit(new ProcessYieldCapturedVarsVisitor()); @@ -884,9 +884,9 @@ - + - + \syntaxvisitors\yieldvisitors\processyieldscapturedvars.cs public ConstructFiniteAutomata1(block bl) @@ -897,8 +897,8 @@ - - \yield\syntaxvisitors\yieldvisitors\processyieldscapturedvars.cs + + \syntaxvisitors\yieldvisitors\processyieldscapturedvars.cs type_declarations GenClassesForYield(procedure_definition pd, type_declarations GenClassesForYield ( procedure_definition pd , IEnumerable < var_def_statement > fields , IDictionary < string , string > localsMap , IDictionary < string , string > formalParamsMap ) @@ -910,7 +910,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs string Consts__Self = YieldHelpers.YieldConsts.Self; @@ -921,7 +921,7 @@ - + \syntaxvisitors\yieldvisitors\processyieldscapturedvars.cs function_header nfh = ObjectCopier.Clone(fh); @@ -932,7 +932,7 @@ - + \treeconverter\treeconversion\syntax_tree_visitor.cs private Dictionary<Guid, semantic_type_node> _yieldForeachTypeMap = new Dictionary<Guid, semantic_type_node>(); @@ -943,7 +943,7 @@ - + \syntaxvisitors\yieldvisitors\processyieldscapturedvars.cs //InsertHelperMethod(pd, pdCloned); // SSM 13.07.16 - вызов этого метода можно не добавлять @@ -954,9 +954,9 @@ - + - + \treeconverter\treeconversion\syntax_tree_visitor.cs public override void visit(SyntaxTree.yield_unknown_expression_type _unk_expr) @@ -967,7 +967,7 @@ - + \treeconverter\treeconversion\syntax_tree_visitor.cs public override void visit(SyntaxTree.assign _assign) @@ -978,7 +978,7 @@ - + \netgenerator\netgenerator.cs TypeInfo ti = helper.GetTypeReference(value.type); @@ -991,9 +991,9 @@ - + - + \treeconverter\treeconversion\syntax_tree_visitor.cs public override void visit(SyntaxTree.yield_unknown_foreach_type _unk) @@ -1004,7 +1004,7 @@ - + \syntaxvisitors\yieldvisitors\loweringvisitor.cs stl.Add(new assign(currentIdent, new dot_node(enumeratorIdent, "Current"))); @@ -1015,7 +1015,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs public override void visit(SyntaxTree.assign _assign) @@ -1026,7 +1026,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs else if (to.type is compiled_type_node) @@ -1037,7 +1037,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs public bool FindIEnumerableElementType ( type_node tn , ref type_node elem_type ) @@ -1047,7 +1047,7 @@ - + \TreeConverter\TreeRealization\generics.cs generic_convertions.all_type_instances.Add(instance); @@ -1058,7 +1058,7 @@ - + \TreeConverter\TreeRealization\generics.cs if (shouldAddToAllTypeInstances) //lroman// Если зашли сюда при выведении типов параметров лямбды, то тип инстанцироваться может с типом lambda_any_type_node. Поэтому, если выводим типы. То данную инстанцию не добавляем @@ -1069,7 +1069,7 @@ - + \syntaxvisitors\yieldvisitors\processyieldscapturedvars.cs class ConstructFiniteAutomata @@ -1092,7 +1092,7 @@ - + \syntaxvisitors\yieldvisitors\processyieldscapturedvars.cs ReplaceCapturedVariables(pd, dld.LocalDeletedDefs, out CapturedLocalsNamesMap, out CapturedFormalParamsNamesMap); @@ -1103,7 +1103,7 @@ - + \syntaxvisitors\yieldvisitors\processyieldscapturedvars.cs var pdCloned = ObjectCopier.Clone(pd); @@ -1114,7 +1114,7 @@ - + \syntaxvisitors\YieldVisitors\MarkMethodHasYieldVisitor.cs if (pd.has_yield) // SSM bug fix #219 @@ -1127,9 +1127,9 @@ - + - + \TreeConverter\TreeConversion\convertion_data_and_alghoritms.cs return AddError<function_node>(new SeveralFunctionsCanBeCalled(loc,set_of_possible_functions)); @@ -1140,7 +1140,7 @@ - + \TreeConverter\TreeConversion\convertion_data_and_alghoritms.cs if (funcs.Count == 2) @@ -1153,9 +1153,9 @@ - + - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs internal void visit_method_call(SyntaxTree.method_call _method_call) @@ -1168,9 +1168,9 @@ - + - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs public override void visit(SyntaxTree.foreach_stmt _foreach_stmt) @@ -1181,7 +1181,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs public override void visit(SyntaxTree.semantic_type_node stn) diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index b9df37f5b..7e13880ed 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.1.0.1286' +!define VERSION '3.1.0.1288' diff --git a/TestSuite/CompilationSamples/PABCSystem.pas b/TestSuite/CompilationSamples/PABCSystem.pas index ba0e067c6..a5391d3c9 100644 --- a/TestSuite/CompilationSamples/PABCSystem.pas +++ b/TestSuite/CompilationSamples/PABCSystem.pas @@ -3790,7 +3790,7 @@ end; type // Вспомогательный класс для генерации бесконечной последовательности целых, начиная с заданного значения - IntNumbersClass = class(SeqBaseInteger,IEnumerable,IEnumerator) +{ IntNumbersClass = class(SeqBaseInteger,IEnumerable,IEnumerator) private first,cur: integer; public @@ -3812,7 +3812,7 @@ type begin cur := first-1; end; - end; + end;} // Вспомогательный класс для генерации рекуррентных последовательностей IterateClass = class(SeqBase,IEnumerable,IEnumerator) @@ -7911,34 +7911,60 @@ end; /// Возвращает бесконечную последовательность целых от текущего значения с шагом 1 function Step(Self: integer): sequence of integer; extensionmethod; begin - Result := IntNumbersClass.Create(Self); + //Result := IntNumbersClass.Create(Self); + var s := Self; + while True do + begin + yield s; + s += 1; + end; end; /// Возвращает бесконечную последовательность целых от текущего значения с шагом step function Step(Self: integer; step: integer): sequence of integer; extensionmethod; begin - var slf := Self; - Result := IntNumbersClass.Create().Select(x->x*step+slf); + {var slf := Self; + Result := IntNumbersClass.Create().Select(x->x*step+slf);} + var s := Self; + while True do + begin + yield s; + s += step; + end; end; /// Возвращает бесконечную последовательность вещественных от текущего значения с шагом step function Step(Self: real; step: real): sequence of real; extensionmethod; begin - var slf := Self; - Result := IntNumbersClass.Create().Select(x->x*step+slf); + {var slf := Self; + Result := IntNumbersClass.Create().Select(x->x*step+slf);} + var s := Self; + while True do + begin + yield s; + s += step; + end; end; // Возвращает бесконечную последовательность элементов, совпадающих с данным ///-- function &Repeat(Self: T): sequence of T; extensionmethod; begin - Result := SeqFill(MaxInt,Self); + var s := Self; + while True do + yield s; end; /// Повторяет последовательность бесконечное число раз function Cycle(Self: sequence of T): sequence of T; extensionmethod; begin - Result := SeqFill(MaxInt,Self).SelectMany(x->x); + var s := Self; + while True do + begin + foreach var x in s do + yield x; + end; +// Result := SeqFill(MaxInt,Self).SelectMany(x->x); end; //------------------------------------------------------------------------------ @@ -8053,7 +8079,7 @@ end; // Дополнения февраль 2016: MinBy, MaxBy, TakeLast, Slice, Cartesian, SplitAt, // Partition, ZipTuple, UnZipTuple, Interleave, Numerate, Tabulate, Pairwise, Batch -/// Возвращает элемент последовательности с минимальным значением ключа +/// Возвращает первый элемент последовательности с минимальным значением ключа function MinBy(Self: sequence of T; selector: T -> TKey): T; extensionmethod; begin if selector = nil then @@ -8065,7 +8091,7 @@ begin Result := Self.Aggregate((min,x)-> comp.Compare(selector(x),selector(min))<0 ? x : min); end; -/// Возвращает элемент последовательности с максимальным значением ключа +/// Возвращает первый элемент последовательности с максимальным значением ключа function MaxBy(Self: sequence of T; selector: T -> TKey): T; extensionmethod; begin if selector = nil then @@ -8074,7 +8100,31 @@ begin raise new InvalidOperationException('Empty sequence'); var comp := Comparer&.Default; - Result := Self.Aggregate((max,x)-> comp.Compare(selector(x),selector(max))<0 ? max : x); + Result := Self.Aggregate((max,x)-> comp.Compare(selector(x),selector(max))>0 ? x : max); +end; + +/// Возвращает последний элемент последовательности с минимальным значением ключа +function LastMinBy(Self: sequence of T; selector: T -> TKey): T; extensionmethod; +begin + if selector = nil then + raise new ArgumentNullException('selector'); + if not Self.Any() then + raise new InvalidOperationException('Empty sequence'); + + var comp := Comparer&.Default; + Result := Self.Aggregate((min,x)-> comp.Compare(selector(x),selector(min))<=0 ? x : min); +end; + +/// Возвращает последний элемент последовательности с максимальным значением ключа +function LastMaxBy(Self: sequence of T; selector: T -> TKey): T; extensionmethod; +begin + if selector = nil then + raise new ArgumentNullException('selector'); + if not Self.Any() then + raise new InvalidOperationException('Empty sequence'); + + var comp := Comparer&.Default; + Result := Self.Aggregate((max,x)-> comp.Compare(selector(x),selector(max))>=0 ? x : max); end; /// Возвращает последние count элементов последовательности @@ -8228,9 +8278,19 @@ end; /// Превращает последовательность в последовательность пар соседних элементов function Pairwise(Self: sequence of T): sequence of (T,T); extensionmethod; begin - Result := Self.ZipTuple(Self.Skip(1)); + var previous: T; + var it := Self.GetEnumerator(); + if (it.MoveNext()) then + previous := it.Current; + + while (it.MoveNext()) do + begin + yield (previous,it.Current); + previous := it.Current; + end end; + /// Превращает последовательность в последовательность пар соседних элементов, применяет func к каждой паре полученных элементов и получает новую последовательность function Pairwise(Self: sequence of T; func:(T,T)->Res): sequence of Res; extensionmethod; begin @@ -8500,21 +8560,8 @@ begin end; end; -/// Возвращает индекс первого максимального элемента -function IndexMax(self: array of T): integer; extensionmethod; where T: System.IComparable; -begin - var max := Self[0]; - Result := 0; - for var i:=1 to Self.Length-1 do - if Self[i].CompareTo(max)>0 then - begin - Result := i; - max := Self[i]; - end; -end; - /// Возвращает индекс первого максимального элемента начиная с позиции start -function IndexMax(self: array of T; start: integer): integer; extensionmethod; where T: System.IComparable; +function IndexMax(self: array of T; start: integer := 0): integer; extensionmethod; where T: System.IComparable; begin var max := Self[start]; Result := start; @@ -8552,6 +8599,32 @@ begin end; end; +/// Возвращает индекс последнего минимального элемента +function LastIndexMax(Self: array of T): integer; extensionmethod; where T: System.IComparable; +begin + var max := Self[Self.Length-1]; + Result := Self.Length-1; + for var i:=Self.Length-2 downto 0 do + if Self[i].CompareTo(max)>0 then + begin + Result := i; + max := Self[i]; + end; +end; + +/// Возвращает индекс последнего минимального элемента начиная с позиции start +function LastIndexMax(Self: array of T; start: integer): integer; extensionmethod; where T: System.IComparable; +begin + var max := Self[start]; + Result := start; + for var i:=start-1 downto 0 do + if Self[i].CompareTo(max)>0 then + begin + Result := i; + max := Self[i]; + end; +end; + /// Заменяет в массиве все вхождения одного значения на другое procedure Replace(Self: array of T; oldValue,newValue: T); extensionmethod; begin diff --git a/Yield/YieldConversionSyntax/YieldDesugarSyntaxTreeConverter.cs b/Yield/YieldConversionSyntax/YieldDesugarSyntaxTreeConverter.cs index 5d62ea8ac..4af44b28c 100644 --- a/Yield/YieldConversionSyntax/YieldDesugarSyntaxTreeConverter.cs +++ b/Yield/YieldConversionSyntax/YieldDesugarSyntaxTreeConverter.cs @@ -30,7 +30,7 @@ namespace YieldDesugarSyntaxTreeConverter #if DEBUG try { - root.visit(new SimplePrettyPrinterVisitor(@"d:\\zzz1.txt")); + // root.visit(new SimplePrettyPrinterVisitor(@"d:\\zzz1.txt")); } catch { diff --git a/bin/Lib/PABCRtl.dll b/bin/Lib/PABCRtl.dll index 6e1cc3e6e..4f095a4f8 100644 Binary files a/bin/Lib/PABCRtl.dll and b/bin/Lib/PABCRtl.dll differ diff --git a/bin/Lib/PABCSystem.pas b/bin/Lib/PABCSystem.pas index ba715eb89..0b2ffc6ff 100644 --- a/bin/Lib/PABCSystem.pas +++ b/bin/Lib/PABCSystem.pas @@ -3790,7 +3790,7 @@ end; type // Вспомогательный класс для генерации бесконечной последовательности целых, начиная с заданного значения - IntNumbersClass = class(SeqBaseInteger,IEnumerable,IEnumerator) +{ IntNumbersClass = class(SeqBaseInteger,IEnumerable,IEnumerator) private first,cur: integer; public @@ -3812,7 +3812,7 @@ type begin cur := first-1; end; - end; + end;} // Вспомогательный класс для генерации рекуррентных последовательностей IterateClass = class(SeqBase,IEnumerable,IEnumerator) @@ -7911,34 +7911,60 @@ end; /// Возвращает бесконечную последовательность целых от текущего значения с шагом 1 function Step(Self: integer): sequence of integer; extensionmethod; begin - Result := IntNumbersClass.Create(Self); + //Result := IntNumbersClass.Create(Self); + var s := Self; + while True do + begin + yield s; + s += 1; + end; end; /// Возвращает бесконечную последовательность целых от текущего значения с шагом step function Step(Self: integer; step: integer): sequence of integer; extensionmethod; begin - var slf := Self; - Result := IntNumbersClass.Create().Select(x->x*step+slf); + {var slf := Self; + Result := IntNumbersClass.Create().Select(x->x*step+slf);} + var s := Self; + while True do + begin + yield s; + s += step; + end; end; /// Возвращает бесконечную последовательность вещественных от текущего значения с шагом step function Step(Self: real; step: real): sequence of real; extensionmethod; begin - var slf := Self; - Result := IntNumbersClass.Create().Select(x->x*step+slf); + {var slf := Self; + Result := IntNumbersClass.Create().Select(x->x*step+slf);} + var s := Self; + while True do + begin + yield s; + s += step; + end; end; // Возвращает бесконечную последовательность элементов, совпадающих с данным ///-- function &Repeat(Self: T): sequence of T; extensionmethod; begin - Result := SeqFill(MaxInt,Self); + var s := Self; + while True do + yield s; end; /// Повторяет последовательность бесконечное число раз function Cycle(Self: sequence of T): sequence of T; extensionmethod; begin - Result := SeqFill(MaxInt,Self).SelectMany(x->x); + var s := Self; + while True do + begin + foreach var x in s do + yield x; + end; +// Result := SeqFill(MaxInt,Self).SelectMany(x->x); end; //------------------------------------------------------------------------------ @@ -8319,6 +8345,121 @@ begin Result := Self.Skip(from).Where((x,i)->i mod step = 0).Take(count) end; +// Дополнения июль 2016: Incremental +///-- +function IncrementalSeq(Self: sequence of integer): sequence of integer; +begin + var iter := Self.GetEnumerator(); + if iter.MoveNext() then + begin + var prevItem := iter.Current; + while iter.MoveNext() do + begin + var nextItem := iter.Current; + yield nextItem - prevItem; + prevItem := nextItem; + end + end +end; + +///-- +function IncrementalSeq(Self: sequence of real): sequence of real; +begin + var iter := Self.GetEnumerator(); + if iter.MoveNext() then + begin + var prevItem := iter.Current; + while iter.MoveNext() do + begin + var nextItem := iter.Current; + yield nextItem - prevItem; + prevItem := nextItem; + end + end +end; + +/// Возвращает последовательность разностей соседних элементов исходной последовательности +function Incremental(Self: sequence of integer): sequence of integer; extensionmethod; +begin + Result := IncrementalSeq(Self); +end; + +/// Возвращает последовательность разностей соседних элементов исходной последовательности +function Incremental(Self: array of integer): sequence of integer; extensionmethod; +begin + Result := IncrementalSeq(Self); +end; + +/// Возвращает последовательность разностей соседних элементов исходной последовательности +function Incremental(Self: List): sequence of integer; extensionmethod; +begin + Result := IncrementalSeq(Self); +end; + +/// Возвращает последовательность разностей соседних элементов исходной последовательности +function Incremental(Self: LinkedList): sequence of integer; extensionmethod; +begin + Result := IncrementalSeq(Self); +end; + +/// Возвращает последовательность разностей соседних элементов исходной последовательности +function Incremental(Self: sequence of real): sequence of real; extensionmethod; +begin + Result := IncrementalSeq(Self); +end; + +/// Возвращает последовательность разностей соседних элементов исходной последовательности +function Incremental(Self: array of real): sequence of real; extensionmethod; +begin + Result := IncrementalSeq(Self); +end; + +/// Возвращает последовательность разностей соседних элементов исходной последовательности +function Incremental(Self: List): sequence of real; extensionmethod; +begin + Result := IncrementalSeq(Self); +end; + +/// Возвращает последовательность разностей соседних элементов исходной последовательности +function Incremental(Self: LinkedList): sequence of real; extensionmethod; +begin + Result := IncrementalSeq(Self); +end; + +/// Возвращает последовательность разностей соседних элементов исходной последовательности. В качестве функции разности используется func +function Incremental(Self: sequence of T; func: (T,T)->T1): sequence of T1; extensionmethod; +begin + var iter := Self.GetEnumerator(); + if iter.MoveNext() then + begin + var prevItem := iter.Current; + while iter.MoveNext() do + begin + var nextItem := iter.Current; + yield func(prevItem,nextItem); + prevItem := nextItem; + end + end +end; + +/// Возвращает последовательность разностей соседних элементов исходной последовательности. В качестве функции разности используется func +function Incremental(Self: sequence of T; func: (T,T,integer)->T1): sequence of T1; extensionmethod; +begin + var iter := Self.GetEnumerator(); + if iter.MoveNext() then + begin + var ind := 0; + var prevItem := iter.Current; + while iter.MoveNext() do + begin + var nextItem := iter.Current; + ind += 1; + yield func(prevItem,nextItem,ind); + prevItem := nextItem; + end + end +end; + // ----------------------------------------------------- //>> Методы расширения типа List # Extension methods for List T // -----------------------------------------------------