diff --git a/TestSuite/CompilationSamples/GraphABC.pas b/TestSuite/CompilationSamples/GraphABC.pas index 243656f5f..ba21d4234 100644 --- a/TestSuite/CompilationSamples/GraphABC.pas +++ b/TestSuite/CompilationSamples/GraphABC.pas @@ -580,16 +580,18 @@ function ClientRectangle: System.Drawing.Rectangle; //------------------------------------------ //// Рисование графиков функций //------------------------------------------ -/// Рисует график функции f на отрезке [a,b] в прямоугольнике, задаваемом координатами x1,y1,x2,y2, -procedure Draw(f: Func; a,b: real; x1,y1,x2,y2: integer); -/// Рисует график функции f на отрезке [a,b] в прямоугольнике r -procedure Draw(f: Func; a,b: real; r: System.Drawing.Rectangle); -/// Рисует график функции f на отрезке [-5,5] в прямоугольнике r -procedure Draw(f: Func; r: System.Drawing.Rectangle); -/// Рисует график функции f на отрезке [a,b] на полное графическое окно -procedure Draw(f: Func; a,b: real); -/// Рисует график функции f на отрезке [-5,5] на полное графическое окно -procedure Draw(f: Func); +/// Рисует график функции f, заданной на отрезке [a,b] по оси абсцисс и на отрезке [min,max] по оси ординат, в прямоугольнике, задаваемом координатами x1,y1,x2,y2, +procedure Draw(f: real -> real; a,b,min,max: real; x1,y1,x2,y2: integer); +/// Рисует график функции f, заданной на отрезке [a,b], в прямоугольнике, задаваемом координатами x1,y1,x2,y2, +procedure Draw(f: real -> real; a,b: real; x1,y1,x2,y2: integer); +/// Рисует график функции f, заданной на отрезке [a,b], в прямоугольнике r +procedure Draw(f: real -> real; a,b: real; r: System.Drawing.Rectangle); +/// Рисует график функции f, заданной на отрезке [-5,5], в прямоугольнике r +procedure Draw(f: real -> real; r: System.Drawing.Rectangle); +/// Рисует график функции f, заданной на отрезке [a,b], на полное графическое окно +procedure Draw(f: real -> real; a,b: real); +/// Рисует график функции f, заданной на отрезке [-5,5], на полное графическое окно +procedure Draw(f: real -> real); //------------------------------------------ //// Рисование изображений @@ -3490,7 +3492,7 @@ end; type FS = auto class mx,my,a,max: real; x0,y0: integer; - f: Func; + f: real -> real; function Apply(x: real): Point; begin @@ -3498,7 +3500,15 @@ type FS = auto class end; end; -procedure Draw(f: Func; a,b: real; x1,y1,x2,y2: integer); +procedure Draw(f: real -> real; a,b,min,max: real; x1,y1,x2,y2: integer); +begin + Rectangle(x1,y1,x2+1,y2+1); + var n := (x2-x1) div 3; + var fso := new FS((x2-x1)/(b-a),(y2-y1)/(max-min),a,max,x1,y1,f); + Polyline(Range(a,b,n).Select(fso.Apply).ToArray) +end; + +procedure Draw(f: real -> real; a,b: real; x1,y1,x2,y2: integer); begin Rectangle(x1,y1,x2+1,y2+1); var n := (x2-x1) div 3; @@ -3508,7 +3518,7 @@ begin Polyline(Range(a,b,n).Select(fso.Apply).ToArray) end; -procedure Draw(f: Func; a,b: real; r: System.Drawing.Rectangle); +procedure Draw(f: real -> real; a,b: real; r: System.Drawing.Rectangle); var x1 := r.X; y1 := r.Y; x2 := r.X+r.Width-1; y2 := r.Y+r.Height-1; @@ -3516,12 +3526,12 @@ begin Draw(f,a,b,x1,y1,x2,y2); end; -procedure Draw(f: Func; r: System.Drawing.Rectangle); +procedure Draw(f: real -> real; r: System.Drawing.Rectangle); begin Draw(f,-5,5,r); end; -procedure Draw(f: Func; a,b: real); +procedure Draw(f: real -> real; a,b: real); var x1 := 0; y1 := 0; x2 := Window.Width-1; y2 := Window.Height-1; @@ -3529,7 +3539,7 @@ begin Draw(f,a,b,x1,y1,x2,y2); end; -procedure Draw(f: Func); +procedure Draw(f: real -> real); begin Draw(f,-5,5); end; diff --git a/TestSuite/CompilationSamples/PABCSystem.pas b/TestSuite/CompilationSamples/PABCSystem.pas index e79359410..3659c6c34 100644 --- a/TestSuite/CompilationSamples/PABCSystem.pas +++ b/TestSuite/CompilationSamples/PABCSystem.pas @@ -1155,8 +1155,12 @@ function Power(x, y: integer): real; function Power(x: BigInteger; y: integer): BigInteger; /// Возвращает x, округленное до ближайшего целого function Round(x: real): integer; -/// Возвращает целую часть числа x +/// Возвращает x, округленное до ближайшего большого целого +function RoundBigInteger(x: real): BigInteger; +/// Возвращает целую часть вещественного числа x function Trunc(x: real): integer; +/// Возвращает целую часть вещественного числа x как BigInteger +function TruncBigInteger(x: real): BigInteger; /// Возвращает целую часть числа x function Int(x: real): real; /// Возвращает дробную часть числа x @@ -2977,6 +2981,66 @@ end; //------------------------------------------------------------------------------ // Extension methods for BigInteger //------------------------------------------------------------------------------ +function BigInteger.operator>(p: BigInteger; q: integer): boolean; +begin + Result := p > BigInteger.Create(q); +end; + +function BigInteger.operator>(p: integer; q: BigInteger): boolean; +begin + Result := BigInteger.Create(p) > q; +end; + +function BigInteger.operator<(p: BigInteger; q: integer): boolean; +begin + Result := p < BigInteger.Create(q); +end; + +function BigInteger.operator<(p: integer; q: BigInteger): boolean; +begin + Result := BigInteger.Create(p) < q; +end; + +function BigInteger.operator>=(p: BigInteger; q: integer): boolean; +begin + Result := p >= BigInteger.Create(q); +end; + +function BigInteger.operator>=(p: integer; q: BigInteger): boolean; +begin + Result := BigInteger.Create(p) >= q; +end; + +function BigInteger.operator<=(p: BigInteger; q: integer): boolean; +begin + Result := p <= BigInteger.Create(q); +end; + +function BigInteger.operator<=(p: integer; q: BigInteger): boolean; +begin + Result := BigInteger.Create(p) <= q; +end; + +function BigInteger.operator=(p: BigInteger; q: integer): boolean; +begin + Result := p = BigInteger.Create(q); +end; + +function BigInteger.operator=(p: integer; q: BigInteger): boolean; +begin + Result := BigInteger.Create(p) = q; +end; + +function BigInteger.operator<>(p: BigInteger; q: integer): boolean; +begin + Result := p <> BigInteger.Create(q); +end; + +function BigInteger.operator<>(p: integer; q: BigInteger): boolean; +begin + Result := BigInteger.Create(p) <> q; +end; + procedure BigInteger.operator+=(var p: BigInteger; q: BigInteger); begin p := p + q; @@ -6095,11 +6159,21 @@ begin Result := Convert.ToInt32(Math.Round(x)); end; +function RoundBigInteger(x: real): BigInteger; +begin + Result := BigInteger.Create(Math.Round(x)); +end; + function Trunc(x: real): integer; begin Result := Convert.ToInt32(Math.Truncate(x)); end; +function TruncBigInteger(x: real): BigInteger; +begin + Result := BigInteger.Create(Math.Truncate(x)); +end; + function Int(x: real): real; begin //if x>=0 then @@ -7169,7 +7243,7 @@ begin end; //------------------------------------------------------------------------------ -// char ext +// char методы расширения //------------------------------------------------------------------------------ // Преобразовать символ в цифру function char.ToDigit(self: char): integer; extensionmethod; @@ -7230,7 +7304,7 @@ begin end; //------------------------------------------------------------------------------ -// string ext +// string методы расширения //------------------------------------------------------------------------------ /// Преобразует строку в целое function string.ToInteger: integer; @@ -7238,6 +7312,12 @@ begin Result := integer.Parse(Self); end; +/// Преобразует строку в BigInteger +function string.ToBigInteger: BigInteger; +begin + Result := BigInteger.Parse(Self); +end; + /// Преобразует строку в вещественное function string.ToReal: real; begin diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index e7c745324..976b82bb2 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -16102,7 +16102,7 @@ namespace PascalABCCompiler.TreeConverter public List visit_type_list_with_check(List types, List gpe_list, bool where_checking) { List tparams = new List(); - foreach (SyntaxTree.named_type_reference id in types) + foreach (SyntaxTree.type_definition id in types) { type_node tn = ret.visit(id); CompilationErrorWithLocation not_useful = generic_parameter_eliminations.check_type_generic_useful(tn, get_location(id));