diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index 3b2e12d7b..8b571d2f9 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 = "11"; public const string Build = "0"; - public const string Revision = "3693"; + public const string Revision = "3699"; 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 482976893..f1e858597 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ %MINOR%=11 -%REVISION%=3693 +%REVISION%=3699 %COREVERSION%=0 %MAJOR%=3 diff --git a/PABCNetHelp/Common/Net.html b/PABCNetHelp/Common/Net.html index e7a9db332..1beb14772 100644 --- a/PABCNetHelp/Common/Net.html +++ b/PABCNetHelp/Common/Net.html @@ -112,9 +112,9 @@ Microsoft.NET - среда
  • Сборщик мусора начинает работу в момент исчерпания динамической памяти, его работа занимает несколько миллисекунд. Для приложений реального времени это непозволительно.
  • -
  • Запуск .NET-приложения обязательно требует -установки на компьютере платформы .NET. Без нее -приложение работать не будет (Отметим, что в Windows Vista и в +
  • Запуск .NET-приложения обязательно требует установки на компьютере + платформы .NET. Без нее приложение работать не будет (Отметим, что в Windows + начиная с  Windows 7 платформа .NET встроена).
  • Отметим, что достоинства платформы .NET diff --git a/PABCNetHelp/ForEducation/CheckedTasks/checkedtasks1.html b/PABCNetHelp/ForEducation/CheckedTasks/checkedtasks1.html index 55680ff9b..e7a74eb51 100644 --- a/PABCNetHelp/ForEducation/CheckedTasks/checkedtasks1.html +++ b/PABCNetHelp/ForEducation/CheckedTasks/checkedtasks1.html @@ -58,13 +58,13 @@


    Шаг 2. Переменные a и b -считываются из полей ввода, выделенных желтым цветом, с помощью обычной процедуры read. Закроем окно задачника +считываются из полей ввода, выделенных желтым цветом, с помощью обычной функции +ReadInteger, ReadReal ... Закроем окно задачника и изменим программу следующим образом:

    - uses PT4;
    var a, b: integer;
    - begin

      Task('Begin3');
    -  read(a, b);
    + uses PT4;

    begin

      Task('Begin3');
    +   var (a,b) := ReadInteger2;
    end.

    После запуска этого вариант программы окно задачник примет вид:

    @@ -86,9 +86,8 @@

    Шаг 3. Исправим тип исходных данных:

    - uses PT4;
    var a, b: real;
    - begin

      Task('Begin3');
    -  read(a, b);
    + uses PT4;

    begin

      Task('Begin3');
    +   var (a,b) := ReadReal2;
    end.

    Вновь запустим программу:

    @@ -106,12 +105,11 @@

    Шаг 4. Проведем вычисления и выведем результирующие данные, но в неверном порядке:

    - uses PT4;
    var a, b, S, P: real;
    - begin

      Task('Begin3');
    -  read(a, b);
    -   S := a * b;
    -   P := 2 * (a + b);
    -   write(P, S)
    + uses PT4;

    begin

      Task('Begin3');
    +   var (a,b) := ReadReal2;
    +   var S := a * b;
    +   var P := 2 * (a + b);
    +   Print(P, S)
    end.

    Вновь запустим программу:

    @@ -129,10 +127,12 @@

    Шаг 5. Исправим ошибку:

    - uses PT4;
    var a, b, S, P: real;
    begin

      Task('Begin3');
      read(a, b);
    -   S := a * b;
    -   P := 2 * (a + b);
    -   write(S, P)
    end.
    + uses PT4;

    begin

      Task('Begin3');
    +   var (a,b) := ReadReal2;
    +   var S := a * b;
    +   var P := 2 * (a + b);
    +   Print(S, P)
    + end.

    После запуска программы увидим следующее окно:

    diff --git a/PABCNetHelp/ForEducation/CheckedTasks/ctexam.html b/PABCNetHelp/ForEducation/CheckedTasks/ctexam.html index 81bccb8fe..c2d884308 100644 --- a/PABCNetHelp/ForEducation/CheckedTasks/ctexam.html +++ b/PABCNetHelp/ForEducation/CheckedTasks/ctexam.html @@ -37,13 +37,14 @@ или клавиатурной комбинации Shift+Ctrl+L. Приведем текст созданной заготовки:

    -
    uses PT4Exam;
    +
    uses PT4Exam; -begin +

    begin
    +
      Task('ExamBegin2'); -end. -
    +
    end
    . +

    После запуска программы на экране появится окно задачника:

    @@ -93,33 +94,15 @@

    Приступим к выполнению задания. В данном случае следует использовать алгоритм, не требующий применения массивов, поэтому опишем три простые переменные вещественного типа и введем в них исходные данные:

    -
    uses PT4Exam;
    -var
    -  a, b, c: real;
    -begin
    +
    uses PT4Exam; +

    begin

      Task('ExamBegin2'); - read(a, b, c); -end. -
    -

    Мы воспользовались стандартной процедурой ввода read, введя все три исходных числа за один ее вызов. -Этого же результата мы могли бы добиться и с помощью процедуры readln: -

    -
    readln(a, b, c);
    -
    -

    Заметим, что использование отдельных процедур readln для ввода каждого числа приведет к ошибочному результату: -

    -
    readln(a);
    -readln(b);
    -readln(c);
    -
    -

    В этом случае уже после ввода первого числа произойдет автоматический переход на следующую строку -с исходными данными. Поэтому оставшиеся в первой строке числа будут пропущены, а поскольку -во второй строке «ничего нет» (входной поток состоит из единственной строки), -будет выведено сообщение об ошибке «Input string was not in a correct format» -(«Входная строка имела неверный формат»). -

    -

    Приведенный пример показывает, что при организации ввода данных в заданиях групп Exam необходимо учитывать особенности -стандартных процедур read и readln. +
      +var + (a,b,c) := ReadReal3; +
    end
    . +

    +

    Мы воспользовались стандартной функцией ввода ReadReal3, введя все три исходных числа за один ее вызов.

    При запуске приведенного выше варианта программы вид окна не изменится, поскольку мы не вывели никаких данных. В заданиях групп Exam запуск программы считается ознакомительным до тех пор, пока программа не выведет @@ -132,22 +115,24 @@ readln(c);

    Реализуем алгоритм нахождения минимального и максимального элемента. Для этого опишем еще две переменные min и max типа real и добавим в конец программы следующие операторы:

    -
    if a < b then
    -begin
    +
    if a < b then +
    begin
    +
      min := a; - max := b; -end -else -begin +
      max := b; +
    end
    +
    else
    +
    begin

      min := b; - max := a; -end; -if c < min then +
      max := a; +
    end
    ; +
    if
    c < min then
      min := c -else - if c > max then +
    else
    + if c > max then
      max := c; -
    + +

    Таким образом, для одновременного нахождения минимального и максимального из трех чисел требуется не более трех операций сравнения и не более трех операций присваивания.

    @@ -161,8 +146,7 @@ readln(c);

    Вначале, в качестве примера, организуем вывод, не соответствующий условиям задачи. Для этого добавим в конец программы следующий оператор:

    -
    writeln(min, max);
    -
    +
    Println(min, max);

    Приведем вид окна задачника при запуске полученной программы:

    @@ -189,16 +173,12 @@ readln(c);

    Для исправления первых двух ошибок достаточно изменить вывод следующим образом:

    -
    writeln('MIN=', min);
    -writeln('MAX=', max);
    -
    +
    Println('MIN=', min);
    Println('MAX=', max);

    Однако в этом случае числа по-прежнему могут содержать неверное число дробных знаков. Для исправления этой последней ошибки проще всего использовать атрибуты форматирования, начинающиеся с символа «:» (двоеточие):

    -
    writeln('MIN=', min:0:2);
    -writeln('MAX=', max:0:2);
    -
    +
    Println('MIN=', min:0:2);
    Println('MAX=', max:0:2);

    Первый атрибут определяет ширину поля вывода (если ширина равна 0, то используется минимально необходимое поле вывода). Наличие второго атрибута (допустимого только для вещественных чисел) означает, что число надо вывести в формате с фиксированной точкой, причем его значение равно количеству дробных знаков. diff --git a/PABCNetHelp/ForEducation/CheckedTasks/index.html b/PABCNetHelp/ForEducation/CheckedTasks/index.html index 4fa7c6717..6799aded7 100644 --- a/PABCNetHelp/ForEducation/CheckedTasks/index.html +++ b/PABCNetHelp/ForEducation/CheckedTasks/index.html @@ -49,47 +49,6 @@ Programming Taskbook свидетельствует, что обучение Робот.

    Исполнитель Робот является бесценным источником заданий для быстрого обучения основным конструкциям программирования школьников средних классов.

    -

    Пример 3. Задание String9 -из электронного задачника Programming Taskbook.

    -

    Данное задание знакомит с особенностями выполнения заданий на обработку символов -и строк. Следует обратить внимание на диагностику ошибки, связанной с выводом строки, длина которой превышает длину -строки — правильного решения.

    -

    Пример 4. Задание File48 -из электронного задачника Programming Taskbook.

    -

    Это задание знакомит с особенностями выполнения заданий -на обработку типизированных файлов. Исходные файлы при вызове -задания создаются на диске, после чего могут обрабатываться по стандартным -правилам. Содержимое файлов, созданных в процессе выполнения задания, -проверяется электронным задачником; после проверки исходные и результирующие -файлы автоматически удаляются. Следует обратить внимание на то, как содержимое -файлов отображается в окне задачника, а также на обработку ошибок времени -выполнения, возникающих при выполнении заданий. В примере описаны типичные ошибки при -работе с файлами и способы их устранения.  

    -

    Пример 5. Задания группы Dynamic -из электронного задачника Programming Taskbook.

    -

    В данном примере описываются задания из раздела, посвященного указателям и линейным динамическим -структурам данных. При вызове задания в динамической памяти создаются все -исходные структуры данных (в виде односвязных или двусвязных списков), а -указатели на элементы этих структур выступают в качестве входных данных задания. -Содержимое всех структур данных отображается в окне задачника в наглядном виде. -Созданные программой ученика структуры данных анализируются задачником и после -анализа все структуры данных удаляются из памяти.

    -

    Пример 6. Задания группы Tree -из электронного задачника Programming Taskbook.

    -

    В данном примере описываются задания на обработку иерархических структур данных — -деревьев. Подобные структуры, как и линейные динамические структуры, рассмотренные -в предыдущем примере, создаются задачником автоматически и в наглядном виде отображаются -в его окне. Для доступа к ним также используются указатели. -

    -

    Пример 7. Задания групп ExamBegin и ExamTaskC -из электронного задачника Programming Taskbook.

    -

    Пример содержит описание процесса выполнения заданий, связанных с ЕГЭ -по информатике. Основной особенностью этих заданий является то, что -при их выполнении требуется использовать стандартные процедуры ввода-вывода языка -Pascal (а не их специальные модификации, реализованные для задачника Programming Taskbook). -Рассматриваются задания из группы ExamBegin, посвященные базовым алгоритмам, -и задания из группы ExamTaskC, посвященные обработке сложных наборов данных. -

    Все примеры, связанные с электронным задачником Programming Taskbook, иллюстрируются изображениями окна задачника в режиме с динамической компоновкой, появившемся в версии 4.11. diff --git a/PABCNetHelp/LangGuide/Classes/attributes.html b/PABCNetHelp/LangGuide/Classes/attributes.html index fcd9f682a..a5cfefac1 100644 --- a/PABCNetHelp/LangGuide/Classes/attributes.html +++ b/PABCNetHelp/LangGuide/Classes/attributes.html @@ -27,7 +27,7 @@ protected, атрибуты static, virtual и override для методов. <

    type AuthorAttribute = class(System.Attribute)
      auto property Name: string;
      constructor (n: string);
      - begin
        name := n;
      end
    end
    ;

    + begin
        Name := n;
      end
    end
    ;

    Следует обратить внимание, что класс атрибута принято оканчивать на Attribute.

    @@ -42,7 +42,7 @@ Attribute.

    Следует обратить внимание, что окончание Attribute можно не указывать.

    Распознать, помечен ли данный класс атрибутом, можно, используя -отражение:

    +анализ типа:

    begin
      var t := typeof(My);
      var attrs := t.GetCustomAttributes(false);
      @@ -51,7 +51,7 @@ Attribute
    .

    then
          Print(auth.Name);
    end.

    -

    След

    +

     

    \ No newline at end of file diff --git a/PABCNetHelp/LangGuide/Classes/autoclasses.html b/PABCNetHelp/LangGuide/Classes/autoclasses.html index e81c7d62d..4d14d9bff 100644 --- a/PABCNetHelp/LangGuide/Classes/autoclasses.html +++ b/PABCNetHelp/LangGuide/Classes/autoclasses.html @@ -27,9 +27,9 @@
    type Person = auto class
      name: string;
      age: integer;
    end;
    var p := new Person('Иванов',20); // конструктор автокласса - генерируется автоматически
    Writeln(p); // вызывается сгенерированный + генерируется автоматически
    Println(p); // вызывается сгенерированный автоматически метод ToString
    -

    Здесь в отличие от действия writeln по умолчанию выводятся значения не только +

    Здесь в отличие от действия Println по умолчанию выводятся значения не только публичных, а всех полей.

    diff --git a/PABCNetHelp/LangGuide/Classes/classcast.html b/PABCNetHelp/LangGuide/Classes/classcast.html index 78bbda286..46e6868f9 100644 --- a/PABCNetHelp/LangGuide/Classes/classcast.html +++ b/PABCNetHelp/LangGuide/Classes/classcast.html @@ -26,14 +26,10 @@     ...
        procedure IncCourse;
      end;
    - ...
    - var
    p: Person;
    -  s: Student;
    - begin
    -  p := new Student('Иванов',20,3,1); // +
    begin

    var p: Person := new Student('Иванов',20,3,1); // неявное преобразование к типу базового класса
    -  s := Student(p); // явное +  var s: Student := Student(p); // явное приведение к типу производного класса
    end.

    diff --git a/PABCNetHelp/LangGuide/Classes/classconstr.html b/PABCNetHelp/LangGuide/Classes/classconstr.html index 7807352b5..fb7d69f0f 100644 --- a/PABCNetHelp/LangGuide/Classes/classconstr.html +++ b/PABCNetHelp/LangGuide/Classes/classconstr.html @@ -45,7 +45,7 @@ property Coun: integer read cnt;

    begin
      var p: Person := new Person('
    Иванов',20);
      var p1: Person := new Person('
    Петров',18);
    -  Writeln(Person.Count); //
    обращение к классовому методу +  Println(Person.Count); // обращение к классовому методу Count
    end.

    В отличие от статических полей и методов, обычные поля и методы называются diff --git a/PABCNetHelp/LangGuide/Classes/extensionmethods.html b/PABCNetHelp/LangGuide/Classes/extensionmethods.html index 4a2cf6f43..22a0ec6ff 100644 --- a/PABCNetHelp/LangGuide/Classes/extensionmethods.html +++ b/PABCNetHelp/LangGuide/Classes/extensionmethods.html @@ -25,14 +25,14 @@ end;

    begin
      MyPrint(1);
      1.MyPrintEx;
    end. -

    Здесь MyPrint - это обычная процедура с параметром типа integer, MyPrintEx - -метод расширения типа integer. При этом при вызове первый параметр MyPrintEx -становится объектом, вызывающим MyPrintEx как метод.

    +

    Здесь MyPrint - это обычная процедура с параметром типа integer, MyPrintEx - +метод расширения типа integer. При этом при вызове первый параметр MyPrintEx становится объектом, вызывающим +MyPrintEx как метод.

    Можно расширить тип последовательности, тогда все классы, являющиеся -последовательностями (динамические одномерные массивы, списки List<T>, множества -HashSet<T> и SortedSet<T>), +последовательностями (динамические одномерные массивы, списки List<T>, множества +HashSet<T> и SortedSet<T>), получат этот метод. Например, в системном модуле PABCSystem так введен метод -расширения ForEach для последовательностей:

    +расширения ForEach для последовательностей:

    procedure &ForEach<T>(Self: sequence of T; action: T -> ()); extensionmethod;
    begin
      foreach x: T in diff --git a/PABCNetHelp/LangGuide/Classes/index_classes.html b/PABCNetHelp/LangGuide/Classes/index_classes.html index d47f8bbc2..0b2abaf3c 100644 --- a/PABCNetHelp/LangGuide/Classes/index_classes.html +++ b/PABCNetHelp/LangGuide/Classes/index_classes.html @@ -58,7 +58,7 @@ Print;
        property Name: string read fName;
        property Age: integer read fAge;
      end
    ;

    procedure
    Person.Print;
    begin
      - Writeln($'Имя: {Name} Возраст: {Age}');
    end;

    + Println($'Имя: {Name} Возраст: {Age}');
    end;

    После слова class в скобках может быть указано имя класса-предка (см. @@ -115,7 +115,7 @@   end;
      ...
    var p: Person := new Person('Иванов',20);
    - Writeln(p); // Имя: Иванов  Возраст: 20

    + Println(p); // Имя: Иванов  Возраст: 20

    Присваивание и передача в качестве параметров подпрограмм

    Переменная типа класс является ссылкой и хранит ссылку на объект, создаваемый @@ -144,9 +144,9 @@ значения.

    var p1 := new Person('Петров',20);
    var p2 := new - Person('Петров',20);
    writeln(p1=p2); // False
    + Person('Петров',20);
    Println(p1 = p2); // False
    p2 := p1;
    - writeln(p1=p2); // True

    + Println(p1 = p2); // True

    Это поведение можно изменить, перегрузив операцию = для класса.

    diff --git a/PABCNetHelp/LangGuide/Classes/inherited.html b/PABCNetHelp/LangGuide/Classes/inherited.html index 189ab3a40..c7dea95bf 100644 --- a/PABCNetHelp/LangGuide/Classes/inherited.html +++ b/PABCNetHelp/LangGuide/Classes/inherited.html @@ -66,7 +66,7 @@ integer);

        procedure Print;
        begin
          inherited;
    -      writeln('Курс: ',course,'  Группа: ',group);
    +      Writeln('Курс: ',course,'  Группа: ',group);
        end;
     

    diff --git a/PABCNetHelp/LangGuide/Classes/isas.html b/PABCNetHelp/LangGuide/Classes/isas.html index 6c50868be..a8d60cb1f 100644 --- a/PABCNetHelp/LangGuide/Classes/isas.html +++ b/PABCNetHelp/LangGuide/Classes/isas.html @@ -32,7 +32,7 @@ B var a1: A;
    ...
    a1 := B.Create;
    - writeln(a1 is B); // True

    + Println(a1 is B); // True

    Если a1 - переменная классового типа, а B - тип класса, то выражение a1 as diff --git a/PABCNetHelp/LangGuide/Classes/operoverloading.html b/PABCNetHelp/LangGuide/Classes/operoverloading.html index 6c2694145..0b4185f7c 100644 --- a/PABCNetHelp/LangGuide/Classes/operoverloading.html +++ b/PABCNetHelp/LangGuide/Classes/operoverloading.html @@ -91,11 +91,19 @@ value: Complex);
        begin
        & end;
      end;

    Можно перегружать операции с помощью методов расширения - в этом случае при -описании подпрограммы не следует писать слово class. Например, так в системном модуле +описании подпрограммы не следует писать слово static. Например, так в системном модуле реализовано добавление числа к строке:

    -

    function operator+(str: string; n: - integer): string; extensionmethod;
    begin
      result := str + +

    function operator+(str: string; n: + integer): string; extensionmethod;
    begin
      + Result := str + + n.ToString;
    end;

    +
    +

    При перегрузке операций методами расширения ключевое слово extensionmethod можно не писать:

    +
    +

    function operator+(str: string; n: + integer): string;
    begin
      + Result := str + n.ToString;
    end;

    Можно перегружать расширенные операции присваивания +=, -= и т.д.:

    diff --git a/PABCNetHelp/LangGuide/Classes/properties.html b/PABCNetHelp/LangGuide/Classes/properties.html index d56017a89..b01fbe864 100644 --- a/PABCNetHelp/LangGuide/Classes/properties.html +++ b/PABCNetHelp/LangGuide/Classes/properties.html @@ -106,7 +106,7 @@ PropertyReader
    , при доступе на запись -   p.Age := p.Age + 1; // компилятор заменяет этот код на p.setAge(p.getAge + 1);
      - writeln(p.Id);
    end.

    + Println(p.Id);
    end.

    Всякий раз, когда мы присваиваем свойству Age новое значение, diff --git a/PABCNetHelp/LangGuide/Classes/virtual.html b/PABCNetHelp/LangGuide/Classes/virtual.html index bac1d2d87..400bb603c 100644 --- a/PABCNetHelp/LangGuide/Classes/virtual.html +++ b/PABCNetHelp/LangGuide/Classes/virtual.html @@ -36,14 +36,14 @@   public
        procedure Print;
        begin
    -      writeln('Base');
    +      Println('Base');
        end;
      end;
      Derived = class(Base)
      public
        procedure Print;
        begin
    -      writeln('Derived');
    +      Println('Derived');
        end;
      end;

    @@ -79,14 +79,14 @@   public
        procedure Print; virtual;
        begin
    -      writeln('Base');
    +      Println('Base');
        end;
      end;
      Derived = class(Base)
      public
        procedure Print; override;
        begin
    -      writeln('Derived');
    +      Println('Derived');
        end;
      end;

    @@ -105,7 +105,7 @@ Derived за счет того что решение о вызове ме

    type
      DerivedTwice1 = class(Derived)
      public
        procedure Print;
    reintroduce;
        - begin
          writeln('DerivedTwice1');
        + begin
          Println('DerivedTwice1');
        end;
      end;

    Если мы хотим начать новую цепочку виртуальности, то следует использовать и @@ -114,7 +114,7 @@ Derived за счет того что решение о вызове ме

    type
      DerivedTwice2 = class(Derived)
      public
        procedure Print;
    virtual; reintroduce;
        - begin
          writeln('DerivedTwice2');
        + begin
          Println('DerivedTwice2');
        end;
      end;

    Если переопределить виртуальную функцию невиртуальной без ключевого слова diff --git a/PABCNetHelp/LangGuide/Classes/visibility.html b/PABCNetHelp/LangGuide/Classes/visibility.html index 5dc9b5c61..9a8f17a94 100644 --- a/PABCNetHelp/LangGuide/Classes/visibility.html +++ b/PABCNetHelp/LangGuide/Classes/visibility.html @@ -57,21 +57,21 @@   B = class(A)
      public
      -   procedure print;
    +   procedure Print;
        begin
    -      writeln(a); // верно, т.к. +      Println(a); // верно, т.к. a - защищенное поле
    -
          writeln(x); // неверно, +       Println(x); // неверно, т.к. х - закрытое поле
        end;
      end;
    ...
    var b1: B := new B(5);
    ...
    - writeln(b1.x); // неверно, т.к. х - закрытое - поле
    writeln(b1.a); // неверно, т.к. a - + Println(b1.x); // неверно, т.к. х - закрытое + поле
    Println(b1.a); // неверно, т.к. a - защищенное поле
    - b1.print; // верно, т.к. print - + b1.Print; // верно, т.к. Print - открытый метод

    Комментарии по тексту программы описывают верное и неверное в смысле доступа обращение к полям и методам.

    diff --git a/PABCNetHelp/LangGuide/CompilerDirectives/index_directives.html b/PABCNetHelp/LangGuide/CompilerDirectives/index_directives.html index 2ddd3316d..d76eb9b17 100644 --- a/PABCNetHelp/LangGuide/CompilerDirectives/index_directives.html +++ b/PABCNetHelp/LangGuide/CompilerDirectives/index_directives.html @@ -28,6 +28,8 @@ + + diff --git a/PABCNetHelp/LangGuide/Generics/generic_sub.html b/PABCNetHelp/LangGuide/Generics/generic_sub.html index 3386fa553..333afb7df 100644 --- a/PABCNetHelp/LangGuide/Generics/generic_sub.html +++ b/PABCNetHelp/LangGuide/Generics/generic_sub.html @@ -54,7 +54,7 @@   x[0] := 1;
      x[1] := 2.71;
      x[2] := 3.14;
    -  writeln(FindFirstInArray(x,1));
    +  Println(FindFirstInArray(x,1));
    end.

    произойдет ошибка. Причина состоит в том, что первый параметр имеет тип @@ -95,10 +95,10 @@ integer, что не соответствует ни одному тип   x := new Pair<integer,real>;
      x.first := 3;
      y := x.ChangeSecond('abc');
    -  writeln(y.first, y.second);
    +  Println(y.first, y.second);
    end.

    -

    По окончании работы данная программа выведет 3abc.

    +

    По окончании работы данная программа выведет 3 abc.

    diff --git a/PABCNetHelp/LangGuide/Generics/generic_sub_params.html b/PABCNetHelp/LangGuide/Generics/generic_sub_params.html index 2ddb0ccaa..f9beace50 100644 --- a/PABCNetHelp/LangGuide/Generics/generic_sub_params.html +++ b/PABCNetHelp/LangGuide/Generics/generic_sub_params.html @@ -16,7 +16,7 @@

    Например, в классе System.Array имеется несколько статических обобщенных методов с обобщенными -подпрограммами в качестве параметров. Так, System.Array.Find +подпрограммами в качестве параметров. Так, System.Array.FindAll имеет следующий прототип:

    System.Array.FindAll<T>(a: array of T; pred: @@ -27,11 +27,7 @@ pred.

    Приведем пример вызова этой функции:

    -

    function f(x: integer): boolean;
    - begin
    -  Result := ;
    - end;

    -

    var a := Seq(1,3,6,5,8);
    +

    var a := [1,3,6,5,8];
    var b := System.Array.FindAll(a,x -> x mod 2 = 0);

    Здесь возвращается массив b, diff --git a/PABCNetHelp/LangGuide/Generics/index_generics.html b/PABCNetHelp/LangGuide/Generics/index_generics.html index 7a5ebcb50..c35594963 100644 --- a/PABCNetHelp/LangGuide/Generics/index_generics.html +++ b/PABCNetHelp/LangGuide/Generics/index_generics.html @@ -59,22 +59,19 @@ Stack<integer> - класс списка с элементами т

    Использование шаблона класса иллюстрируется ниже:

    -

    var
    -  si: Stack<integer>;
    -  sr: Stack<real>;
    - begin
    -  si := new Stack<integer>; 
    -  sr := new Stack<real>;
    +

    begin
    +   var si := new Stack<integer>; 
    +   var sr := new Stack<real>;
      for var i := 1 to 10 do
        si.Push(Random(100));
      while not si.IsEmpty do
        sr.Push(si.Pop);
      while not sr.IsEmpty do
    -    write(sr.Pop,' ');
    +    Print(sr.Pop);
    end.

    Подстановка конкретного типа-параметра в обобщенный тип называется -инстанцированием.

    +инстанцированием.

     

    diff --git a/PABCNetHelp/LangGuide/Interfaces/indexinterf.html b/PABCNetHelp/LangGuide/Interfaces/indexinterf.html index 105e4c131..bc9c4f802 100644 --- a/PABCNetHelp/LangGuide/Interfaces/indexinterf.html +++ b/PABCNetHelp/LangGuide/Interfaces/indexinterf.html @@ -58,7 +58,7 @@ read и write.

        end;
        procedure Print;
        begin
    -      write(xx,' ',yy);
    +      Print(xx,yy);
        end;
      end;

    Интерфейсы можно наследовать друг от @@ -108,7 +108,7 @@ read и write.

      ...
    var p: Point := ip as Point;
    if p<>nil then
    -  writeln('Преобразование успешно');

    +  Println('Преобразование успешно');

    diff --git a/PABCNetHelp/LangGuide/Modules/doccomments.html b/PABCNetHelp/LangGuide/Modules/doccomments.html index d63f2d3e1..ff8a648d6 100644 --- a/PABCNetHelp/LangGuide/Modules/doccomments.html +++ b/PABCNetHelp/LangGuide/Modules/doccomments.html @@ -38,9 +38,9 @@ t1: TTT;

    Документирующие комментарии могут занимать несколько строк, каждая из которых -должна начинаться с /// . Для комментирования +должна начинаться с /// . Для комментирования подпрограмм можно использовать в первой строке документирующий комментарий -///-, тогда его содержимое меняет заголовок +///-, тогда его содержимое меняет заголовок подпрограммы в подсказке при наведении курсора мыши. Например:

    ///- Exclude(var s : set of T; el : T)
    ///Удаляет элемент el из @@ -48,7 +48,7 @@ TypedSet; el: object);

    Если первая строка документирующего комментария имеет вид -///--, то подсказка не всплывает. Это делается +///--, то подсказка не всплывает. Это делается для элементов, которые хочется скрыть от системы всплывающих подсказок.

    diff --git a/PABCNetHelp/LangGuide/Modules/indexmodule.html b/PABCNetHelp/LangGuide/Modules/indexmodule.html index 0310097ac..56a260838 100644 --- a/PABCNetHelp/LangGuide/Modules/indexmodule.html +++ b/PABCNetHelp/LangGuide/Modules/indexmodule.html @@ -81,7 +81,7 @@

    interface

    uses GraphABC;

    const Dim = 5;
    - var Colors: array [1..Dim] of integer;

    + var Colors: array of integer := new integer[Dim];

    function RandomColor: integer;
    procedure FillByRandomColor;

    implementation

    @@ -91,7 +91,7 @@ end;
    procedure FillByRandomColor;
    begin
    for i: integer := 1 to Dim do
    for var i := 0 to Dim-1 do
        Colors[i] := RandomColor;
    end;

    initialization
    diff --git a/PABCNetHelp/LangGuide/Modules/libraries.html b/PABCNetHelp/LangGuide/Modules/libraries.html index 0218eca97..4a4bdf759 100644 --- a/PABCNetHelp/LangGuide/Modules/libraries.html +++ b/PABCNetHelp/LangGuide/Modules/libraries.html @@ -78,21 +78,17 @@ ИмяБиблиотеки}. Например:

    -

    {$reference ABC.dll}
    {$reference ABC1.dll}
    -
    begin
      writeln(a.GetType);
    end.

    +

    {$reference ABC.dll}
    {$reference ABC1.dll}
    +
    begin
      writeln(a.GetType);
    end.

    Подключение библиотеки может проводиться в любом месте исходного файла.

    Библиотеки ABC и ABC1 имеют соответственно вид:

    -

    library ABC;

    -

    var a: integer;

    -

    end.

    -
    +

    library ABC;
    var
    a: integer;
    end
    .
    +

    и

    -

    library ABC1;

    -

    var a: real;

    -

    end.

    +

    library ABC1;
    var
    a: real;
    end
    .

    Алгоритм поиска имен в библиотеках

    В первую очередь имя ищется в исходном модуле, затем в модулях, подключенных @@ -103,9 +99,9 @@

    В случае коллизии имен используемое имя можно предварять именем библиотеки с последующей точкой:

    -

    {$reference ABC.dll}
    {$reference ABC1.dll}
    -
    begin
      writeln(ABC1.a.GetType);
    - end.

    +

    {$reference ABC.dll}
    {$reference ABC1.dll}
    +
    begin
      Println(ABC1.a.GetType);
    + end.

     

    diff --git a/PABCNetHelp/LangGuide/OpenMP/parallelfor.html b/PABCNetHelp/LangGuide/OpenMP/parallelfor.html index f15c9c726..3c7fad9b6 100644 --- a/PABCNetHelp/LangGuide/OpenMP/parallelfor.html +++ b/PABCNetHelp/LangGuide/OpenMP/parallelfor.html @@ -73,7 +73,7 @@ span.a раньше второй – в первый элемент массива запишется значение из второго, а если позже – то из третьего элемента массива.

    -

    var a:integer;
    +

    var a: integer;
    {$omp parallel for}
    for var i:=1 to 10 do
    @@ -93,9 +93,7 @@ span.a параллельности. Вычисление различных элементов матрицы происходит независимо, поэтому не надо предусматривать никаких средств синхронизации.

    -

    uses Arrays;
    -
    - procedure ParallelMult(a,b,c: array [,] of real; n: +

    procedure ParallelMult(a,b,c: array [,] of real; n: integer);
    begin
      {$omp parallel for }
    @@ -127,17 +125,15 @@ span.a
    begin
      var a := - Arrays.CreateRandomRealMatrix(n,n);
    + MatrRandomReal(n,n);
      var b := - Arrays.CreateRandomRealMatrix(n,n);
    + MatrRandomReal(n,n);
      var c := new real[n,n];
      ParallelMult(a,b,c,n);
    -   writeln('Параллельное перемножение матриц: - ',Milliseconds,' миллисекунд');
    +   Println('Параллельное перемножение матриц:',Milliseconds,'миллисекунд');
      var d := Milliseconds;
      Mult(a,b,c,n);
    -   writeln('Непараллельное перемножение матриц: - ',Milliseconds-d,' миллисекунд');
    +   Println('Непараллельное перемножение матриц:',Milliseconds-d,'миллисекунд');
    end.

    diff --git a/PABCNetHelp/LangGuide/OpenMP/reduction.html b/PABCNetHelp/LangGuide/OpenMP/reduction.html index e26d54d24..e6411f98d 100644 --- a/PABCNetHelp/LangGuide/OpenMP/reduction.html +++ b/PABCNetHelp/LangGuide/OpenMP/reduction.html @@ -48,7 +48,7 @@

    var a: integer := 1;
    {$omp parallel for reduction(+:a)}
    -
    for var i: integer:=1 to 2 do
    +
    for var i:=1 to 2 do
      a := a+1;

    Здесь начальное значение переменной a – единица, для действия + локальные diff --git a/PABCNetHelp/LangGuide/OpenMP/sync.html b/PABCNetHelp/LangGuide/OpenMP/sync.html index 16f3664ac..caeb64422 100644 --- a/PABCNetHelp/LangGuide/OpenMP/sync.html +++ b/PABCNetHelp/LangGuide/OpenMP/sync.html @@ -26,11 +26,11 @@

    Критические секции можно использовать при обращении к общим переменным, чтобы избежать потерь данных.

    -

    var a:integer:=0;
    +

    var a: integer := 0;
    {$omp parallel for}
    -
    for var i:integer:=1 to 100 do
    -   {$omp critical}
    -   a:=a+1;

    + for var i:=1 to 100 do
    +   {$omp critical}
    +
      a := a + 1;

    Здесь критическую секцию можно использовать вместо редукции. Весь оператор a:=a+1 выполнится одним потоком и только потом – другим. Однако использование @@ -40,13 +40,13 @@

    Но не во всех случаях использование критических секций помогает обеспечить корректную работу параллельных конструкций.

    -

    var a:integer := 0;
    +

    var a: integer := 0;
    {$omp parallel sections}
    begin
      {$omp critical}
    -
      a:=1;
    +   a := 1;
      {$omp critical}
    -
      a:=a+1;
    +   a := a+1;
    end;

    Значение переменной a зависит от того, в каком порядке выполнятся секции. diff --git a/PABCNetHelp/LangGuide/Operations_Expressions/IfOperation.html b/PABCNetHelp/LangGuide/Operations_Expressions/IfOperation.html index 218e313d6..46b19bc11 100644 --- a/PABCNetHelp/LangGuide/Operations_Expressions/IfOperation.html +++ b/PABCNetHelp/LangGuide/Operations_Expressions/IfOperation.html @@ -39,12 +39,12 @@

    Рекомендуется использовать вторую форму условной операции.

    Ограничение. Вторую форму условной операции нельзя использовать в качестве выражения верхнего уровня в лямбдах. Следующий код -ошибочен:

    +ошибочен:

    var l: real -> real := x -> if x<0 then 0 else x;

    -

    Для решения указанной проблемы можно взять условную операцию в скобки:

    +

    Для решения указанной проблемы нужно взять условную операцию в скобки:

    var l: real -> real := x -> (if x<0 then 0 else x);

    diff --git a/PABCNetHelp/LangGuide/Operations_Expressions/Slice.html b/PABCNetHelp/LangGuide/Operations_Expressions/Slice.html index f6a1dd44b..3ba224457 100644 --- a/PABCNetHelp/LangGuide/Operations_Expressions/Slice.html +++ b/PABCNetHelp/LangGuide/Operations_Expressions/Slice.html @@ -6,13 +6,6 @@ -

    Срезы

    Срез - это набор элементов динамического массива, списка List<T> или строки, @@ -34,28 +27,27 @@ a?[from:to:step]

    и содержит копию элементов исходного контейнера в диапазоне [from, -to) с -шагом step. Запись [from, -to) означает, что элемент с индексом -from включается в -диапазон, а элемент с индексом to - не включается. +to) с +шагом step. Запись [from, +to) означает, что элемент с индексом +from включается в +диапазон, а элемент с индексом to - не включается. Значения from, -to, step +to, step должны быть целыми.

    -

    Если step не указывается, то предполагается, что -step=1, т.е. элементы +

    Если step не указывается, то предполагается, что +step=1, т.е. элементы расположены непрерывно.

    Тип среза совпадает с типом контейнера: срез элементов массива представляет собой массив, срез строки - строку и срез для List<T> также принадлежит к типу List<T>.

    -

    Для обычных срезов исключение генерируется в следующих случаях. Если индекс from выходит за границы, то во +

    Для обычных срезов исключение генерируется в следующих случаях. Если индекс from выходит за границы, то во время выполнения программы возникает исключение. Индекс -to может выходить за границы на 1, т.е. +to может выходить за границы на 1, т.е. находиться в диапазоне [-1..a.Count] для динамических массивов и списков List<T> и в диапазоне [0..s.Length+1] для строк, в противном случае также возникает исключение.

    -

    Если -step=0, то для всех видов срезов генерируется исключение.

    +

    Если step=0, то для всех видов срезов генерируется исключение.

    Срезы вида a? называются безопасными срезами и во всех остальных случаях не генерируют @@ -65,30 +57,29 @@ step=0, то для всех видов срезов генерирует контейнеру.

    Приведём ряд примеров:

    -

    var a := Arr(0,1,2,3,4,5,6);
    Println(a[2:5]); // [2,3,4]
    +

    var a array of integer := [0,1,2,3,4,5,6];
    Println(a[2:5]); // [2,3,4]
    Println(a[2:a.Length]); // [2,3,4,5,6]
    Println(a[2:1000]); // Исключение!
    Println(a?[2:1000]); // [2,3,4,5,6]
    Println(a[2:7:2]); // [2,4,6]
    Println(a[2:0]); // пустой массив
    var s := '0123456';
    Println(s[2:5]); // 123
    Println(s[0:2]); // Исключение!
    Println(s?[0:2]); // 12
    Println(s?[-2::2]); // 135
    Println(s[2:s.Length]); // 12345

    -

    Шаг step может быть отрицательным. Например:

    +

    Шаг step может быть отрицательным. Например:

    var a := Arr(0,1,2,3,4,5,6);
    Println(a[5:2:-1]); // [5,4,3]
    Println(a[2:5:-1]); // пустой массив
    Println(a[a.Length-1:-1:-2]); // [6,4,2,0]

    -

    В записи среза выражение from или выражение -to могут быть пропущены, в этом случае в срез -попадают все элементы с соответствующей стороны. Если -step>0, то пропущенный from полагается -равным индексу первого элемента, пропущенный to +

    В записи среза выражение from или выражение +to могут быть пропущены, в этом случае в срез +попадают все элементы с соответствующей стороны. Если +step>0, то пропущенный from полагается +равным индексу первого элемента, пропущенный to полагается равным индексу последнего элемента + 1. Если -step<0, то пропущенный -from полагается равным индексу последнего -элемента, а пропущенный to - индексу первого -элемента - 1.

    -

    Например:

    +step<0, то пропущенный +from полагается равным индексу последнего +элемента, а пропущенный to - индексу первого +элемента - 1.

    Например:

    var s := '0123456';
    Println(s[2:]); // 23456
    Println(s[:4]); // 012
    Println(s[::-1]); // 6543210

    diff --git a/PABCNetHelp/LangGuide/Operations_Expressions/expressions.html b/PABCNetHelp/LangGuide/Operations_Expressions/expressions.html index 832f7e459..36ebb716a 100644 --- a/PABCNetHelp/LangGuide/Operations_Expressions/expressions.html +++ b/PABCNetHelp/LangGuide/Operations_Expressions/expressions.html @@ -59,30 +59,25 @@ b=1
    , то b shl 10=1024, а not b=254+ (объединение), - (разность) и * (пересечение):

    -

    var
    -  s1,s2,s: set of byte;
    - begin
    -
      s1:=[1..4];
    -  s2:=[2..5];
    -  s:=s1+s2; // s=[1..5]
    -  s:=s1-s2; // s=[1]
    -  s:=s1*s2; // s=[2..4]

    +

    var s1,s2,s: set of byte;
    + s1 := [1..4];
    + s2 := [2..5];
    + s := s1 + s2; // s = [1..5]
    + s := s1 - s2; // s = [1]
    + s := s1 * s2; // s = [2..4]

    К множествам применимы также операции отношения = (равенство), <> (неравенство), <= (вложено) и >= (содержит):

    -

    var
    -  s1,s2,s: set of byte;
    -   b: boolean;
    - begin
    -
      s1:=[1..4];
    -  s2:=[2..5];
    -  s:=[1,2]; 
    -  b:=s1=s2; // b=False
    -  b:=s2<>s; // b=True
    -  b:=s<=s2; // b=False
    -  b:=s1>=s; // b=True

    +

    var s1,s2,s: set of byte;
    + s1 := [1..4];
    + s2 := [2..5];
    + s := [1,2]; 
    + var b := s1=s2; // b = False
    + b := s2 <> s; // b = True
    + b := s <= s2; // b = False
    + b := s1 >= s; // b = True

    Наконец, операция in определяет, принадлежит ли элемент множеству:

    @@ -113,17 +108,17 @@ b=1
    , то b shl 10=1024, а not b=254

    Таблица приоритетов операций

    - +
    - + - + - + - + - + - + - +
    @, not, ^, +, - (унарные), new 1 (наивысший)1 (наивысший)
    **22
    *, @@ -135,18 +130,18 @@ b=1, то b shl 10=1024, а not b=254shr, as, is33
    +, - (бинарные), or, xor 44
    ..55
    =, @@ -156,11 +151,11 @@ b=1, то b shl 10=1024, а not b=254<=, >=, in66
    ?:  7 (низший)7 (низший)
    diff --git a/PABCNetHelp/LangGuide/Operations_Expressions/isasop.html b/PABCNetHelp/LangGuide/Operations_Expressions/isasop.html index ed53f8b3a..5248bf42b 100644 --- a/PABCNetHelp/LangGuide/Operations_Expressions/isasop.html +++ b/PABCNetHelp/LangGuide/Operations_Expressions/isasop.html @@ -49,9 +49,9 @@ Base
    возвращают True,

    var b: Base;

    begin
      b := new Base;
    -   writeln(b is Derived);
    +   Println(b is Derived);
      b := new Derived;
    -   writeln(b is Derived);
    +   Println(b is Derived);
    end.

    первый раз выводится False, diff --git a/PABCNetHelp/LangGuide/Operations_Expressions/oppriority.html b/PABCNetHelp/LangGuide/Operations_Expressions/oppriority.html index d15df1eab..282f666db 100644 --- a/PABCNetHelp/LangGuide/Operations_Expressions/oppriority.html +++ b/PABCNetHelp/LangGuide/Operations_Expressions/oppriority.html @@ -12,18 +12,18 @@

    Таблица приоритетов операций

    - + - - - - + - - +
    **** 1 (наивысший)
    @, + @, not, ^, +, - (унарные), new 2
    *, + *, /, div, mod, @@ -35,18 +35,18 @@ 3
    +, + +, - (бинарные), or, xor 4
    .... 5
    =, + =, <>, <, >, @@ -56,7 +56,7 @@ 6
    ?:  ?:   7 (низший)
    diff --git a/PABCNetHelp/LangGuide/Operations_Expressions/stringop.html b/PABCNetHelp/LangGuide/Operations_Expressions/stringop.html index 2dc749189..cd82b7d88 100644 --- a/PABCNetHelp/LangGuide/Operations_Expressions/stringop.html +++ b/PABCNetHelp/LangGuide/Operations_Expressions/stringop.html @@ -17,12 +17,11 @@

    Строковые операции

    К строкам применимы все операции сравнения <, >, <=, >=, =, <>. Сравнение строк на неравенство осуществляется -лексикографически: s1 < s2 если для -первого несовпадающего символа с номером i s1[i]<s2[i] -или все символы строк совпадают, но s1 короче -s2. -

    -

    Кроме этого, к строкам и символам применима операция +лексикографически: s1 < s2 если для +первого несовпадающего символа с номером i s1[i]<s2[i] +или все символы строк совпадают, но s1 короче +s2. +

    Кроме этого, к строкам и символам применима операция конкатенации (слияния) +, ее результат имеет строковый тип.

    Например, 'a'+'b'='ab'.

    diff --git a/PABCNetHelp/LangGuide/Operations_Expressions/typeof_sizeof.html b/PABCNetHelp/LangGuide/Operations_Expressions/typeof_sizeof.html index 67dfe066b..8cfdab2f0 100644 --- a/PABCNetHelp/LangGuide/Operations_Expressions/typeof_sizeof.html +++ b/PABCNetHelp/LangGuide/Operations_Expressions/typeof_sizeof.html @@ -19,7 +19,7 @@   Derived = class(Base) ... end;

    var b: Base := new Derived;

    begin
    -  writeln(b.GetType = typeof(Derived)); 
    +  Println(b.GetType = typeof(Derived)); 
    end.

    diff --git a/PABCNetHelp/LangGuide/Operators/beginend.html b/PABCNetHelp/LangGuide/Operators/beginend.html index bf5b1190f..656d99d3b 100644 --- a/PABCNetHelp/LangGuide/Operators/beginend.html +++ b/PABCNetHelp/LangGuide/Operators/beginend.html @@ -49,10 +49,9 @@ begin
      var a,b: integer;
    var r: real;
    -   readln(a,b);
    -   x := a/b;
    -   writeln(x);
    +   (a,b) := ReadInteger2;
    +   var x: real := a/b;
    +   Println(x);
    end.
    diff --git a/PABCNetHelp/LangGuide/Operators/break.html b/PABCNetHelp/LangGuide/Operators/break.html index 71b28e224..6016287b4 100644 --- a/PABCNetHelp/LangGuide/Operators/break.html +++ b/PABCNetHelp/LangGuide/Operators/break.html @@ -24,7 +24,7 @@ exit

    flag := False;
    for var i:=1 to 10 do
    begin
    -  read(x);
    var x := ReadInteger;
      if x<0 then continue; // пропуск текущей итерации цикла
      if x=5 then
    @@ -51,6 +51,17 @@ exit

    Вызов exit в разделе операторов основной программы приводит к ее немедленному завершению.

    +

    Оператор exit внутри функции может быть вызван с +параметром для немедленного возврата значения из функции:

    +
    +

    function Analyze(x: integer): boolean;
    + begin
    if x<0 then
    +    exit(False)
    +  ...
    + end;

    +
    +

    Более точно, break, continue и exit в PascalABC.NET являются операторами вызова специальных внутренних процедур.

    diff --git a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Subroutines for sequence generation.html b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Subroutines for sequence generation.html index 26b3a55ac..49500a675 100644 --- a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Subroutines for sequence generation.html +++ b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Subroutines for sequence generation.html @@ -84,13 +84,13 @@
            Возвращает последовательность из указанных элементов function SeqFill<T>(count: integer; x: T): sequence of T;
            Возвращает последовательность из count элементов x -function SeqGen<T>(count: integer; f: integer->T): sequence of T; +function SeqGen<T>(count: integer; f: integer > T): sequence of T;
            Возвращает последовательность из count элементов, заполненных значениями f(i) function SeqGen<T>(count: integer; f: integer->T; from: integer): sequence of T;
            Возвращает последовательность из count элементов, заполненных значениями f(i), начиная с i=from function SeqGen<T>(count: integer; first: T; next: T->T): sequence of T;
            Возвращает последовательность из count элементов, начинающуюся с first, с функцией next перехода от предыдущего к следующему -function SeqGen<T>(count: integer; first, second: T; next: (T,T) ->T): sequence of T; +function SeqGen<T>(count: integer; first, second: T; next: (T,T) > T): sequence of T;
            Возвращает последовательность из count элементов, начинающуюся с first и second,с функцией next перехода от двух предыдущих к следующему function SeqRandom(n: integer := 10; a: integer := 0; b: integer := 100): sequence of integer;
            Возвращает последовательность из n случайных целых элементов diff --git a/PABCNetHelp/LangGuide/ProcFunc/defaultparams.html b/PABCNetHelp/LangGuide/ProcFunc/defaultparams.html index 03b3abb09..645721ef0 100644 --- a/PABCNetHelp/LangGuide/ProcFunc/defaultparams.html +++ b/PABCNetHelp/LangGuide/ProcFunc/defaultparams.html @@ -22,7 +22,7 @@

    procedure PrintTwo(a,b: integer; delim: char := ' ');
    begin
    -  write(a,delim,b);
    +  Write(a,delim,b);
    end;

    ...
    PrintTwo(3,5);
    diff --git a/PABCNetHelp/LangGuide/ProcFunc/forward.html b/PABCNetHelp/LangGuide/ProcFunc/forward.html index 7ebb4ff8b..1ca3e66e1 100644 --- a/PABCNetHelp/LangGuide/ProcFunc/forward.html +++ b/PABCNetHelp/LangGuide/ProcFunc/forward.html @@ -26,7 +26,7 @@ procedure A(i: integer); begin ... - B(i-1); + B(i - 1); end; procedure B(i: integer); begin diff --git a/PABCNetHelp/LangGuide/ProcFunc/localglobal.html b/PABCNetHelp/LangGuide/ProcFunc/localglobal.html index 7d21792d8..6bed0b5f7 100644 --- a/PABCNetHelp/LangGuide/ProcFunc/localglobal.html +++ b/PABCNetHelp/LangGuide/ProcFunc/localglobal.html @@ -23,7 +23,7 @@ var i: integer; begin // к глобальной переменной i внутри процедуры нельзя обратиться - i:=5; // присваивание локальной переменной i; ... + i := 5; // присваивание локальной переменной i; ... end;
    diff --git a/PABCNetHelp/LangGuide/ProcFunc/overloading.html b/PABCNetHelp/LangGuide/ProcFunc/overloading.html index 8c8d293e1..27a7980a9 100644 --- a/PABCNetHelp/LangGuide/ProcFunc/overloading.html +++ b/PABCNetHelp/LangGuide/ProcFunc/overloading.html @@ -83,7 +83,7 @@

    uses un2,un1;

    procedure p(i: integer);
    begin
    -  write(1);
    +  Print(1);
    end;

    begin
      p(2.2);
    @@ -95,7 +95,7 @@

    unit un2;

    procedure p(r: real);
    begin
    -  write(3);
    +  Print(3);
    end;

    end.

    @@ -104,7 +104,7 @@

    unit un1;

    procedure p(r: real);
    begin
    -  write(2);
    +  Print(2);
    end;

    end.

    @@ -126,12 +126,12 @@

    procedure p(i: integer);
    begin
    -  write(1);
    +  Print(1);
    end;

    procedure p(params a: array of integer);
    begin
    -  write(2);
    +  Print(2);
    end;

    begin
      p(1) 
    diff --git a/PABCNetHelp/LangGuide/ProcFunc/params.html b/PABCNetHelp/LangGuide/ProcFunc/params.html index 7912c0d5c..584b0802d 100644 --- a/PABCNetHelp/LangGuide/ProcFunc/params.html +++ b/PABCNetHelp/LangGuide/ProcFunc/params.html @@ -38,7 +38,7 @@

    procedure PrintSquare(i: integer);
    begin
    -  writeln(i*i);
    +  Println(i*i);
    end;
    Тогда при вызове PrintSquare(5*a-b) значение 5*a-b будет вычислено и присвоено переменной i, после чего выполнится тело процедуры.

    Если параметр передается по ссылке, то при вызове @@ -72,9 +72,9 @@   Person = record
        name: string;
        age,height,weight: integer;
    end;

    procedure Print(const p: Person);
    end;

    procedure PrintPupil(const p: Person);
    begin
    -
      write(p.name,' ',p.age,' ',p.height,' ',p.weight);
    +   Print(p.name,p.age,p.height,p.weight);
    end;

    procedure IncAge(var p: Person);
    begin
    diff --git a/PABCNetHelp/LangGuide/ProcFunc/procdef.html b/PABCNetHelp/LangGuide/ProcFunc/procdef.html index 1bfbc0baf..05352aafe 100644 --- a/PABCNetHelp/LangGuide/ProcFunc/procdef.html +++ b/PABCNetHelp/LangGuide/ProcFunc/procdef.html @@ -12,6 +12,13 @@ + @@ -112,11 +119,35 @@
          Result := x;
    end;

    -

    begin
      var a := Seq(1,5,3);
      - writeln(MinElement(a) + Sum(2,3));
    end.

    +

    begin
      var a := [1,5,3];
      + Println(MinElement(a) + Sum(2,3));
    end.

    Если внутри функции не присвоить переменной Result некоторое значение, то функция вернет в результате своего вызова непредсказуемое значение.

    +

    Вместо присваивания Result в теле функции можно вызвать оператор exit с +параметром - это приведет к немедленному выходу из функции и возврату значения:

    +
    +

    function Find<T>(a: + array of T; x: T): boolean;
    + begin
    foreach var y in + a do
    +    if y = x then +
    +       exit(True);
      Result := +False;
    + end;

    +
    +

    Функция может возвращать кортеж значений:

    +
    +

    function DivMod(a,b: integer): (integer,integer);
    +begin
      Result := (a div b, a mod +b);
    e
    nd;

    +
    +

    При вызове такой функции ее результат обычно распаковывается в переменные

    +
    +

    var (a,b) := DivMod(7,2);

    +

    Упрощенный синтаксис описания подпрограмм

    В PascalABC.NET имеется упрощенный синтаксис описания однооператорных процедур:

    @@ -129,7 +160,9 @@

    При этом в ряде случаев для возвращаемого значения функции возможен автовывод типов:

    -

    function Add(a,b: real) := a + b;

    +

    function Add(a,b: real) := a + b;
    function + DivMod(a,b: integer) := (a div b, a mod + b);

    diff --git a/PABCNetHelp/LangGuide/Types/dynamicarrays.html b/PABCNetHelp/LangGuide/Types/dynamicarrays.html index 44df09ed4..6a9fefceb 100644 --- a/PABCNetHelp/LangGuide/Types/dynamicarrays.html +++ b/PABCNetHelp/LangGuide/Types/dynamicarrays.html @@ -45,13 +45,13 @@

    Данный способ хорош тем, что позволяет совместить описание массива и выделение под него памяти:

    -

    var
      a: array of integer := new integer[5];
    -  b: array [,] of real := new real[4,3];

    +

    var a: array of integer := new integer[5];
    + var b: array [,] of real := new real[4,3];

    Описание типа можно при этом опускать - тип автовыводится:

    -

    var
      a := new integer[5];
    -  b := new real[4,3];

    +

    var a := new integer[5];
    + var b := new real[4,3];

    Второй способ выделения памяти под динамический массив использует стандартную процедуру SetLength:

    @@ -62,6 +62,15 @@

    Процедура SetLength обладает тем преимуществом, что при ее повторном вызове старое содержимое массива сохраняется.

    Инициализация динамического массива

    +

    Проще всего инициализировать динамический массив, используя инициализатор [] +- при этом выделяется память:

    +
    +

    var a := [1,3,5,7,9];

    +
    +

    Инициализатор при использовании различных типов выбирает самый общий тип:

    +
    +

    [1,3.4,5]; // array of real
    ['a','','fgh'] // array of string

    +

    Можно инициализировать динамический массив при выделении под него память операцией new:

    @@ -81,7 +90,7 @@

    При этом происходит выделение памяти под указанное справа количество элементов.

    Инициализация одномерного массива проще всего осуществляется стандартными -функциями Seq..., которые выделяют память нужного размера и заполняют массив +функциями Arr..., которые выделяют память нужного размера и заполняют массив указанными значениями:

    var a := Arr(1,3,5,7,8);                   @@ -115,21 +124,21 @@

    После выделения памяти ввод динамического массива можно осуществлять традиционно в цикле:

    for var i:=0 to a.Length-1 - do
      read(a[i]);
    + do
      Read(a[i]);

    Ввод динамического массива можно осуществлять с помощью стандартной функции ReadArrInteger:

    var a := ReadArrInteger(10);

    При этом под динамический массив выделяется память нужного размера.

    Вывод динамического массива

    -

    Процедура write выводит динамический массив, заключая элементы в квадратные +

    Процедура Write выводит динамический массив, заключая элементы в квадратные скобки и разделяя их запятыми:

    -
    var a := Arr(1,3,5,7,9);
    - writeln(a); // [1,3,5,7,9]
                  +
    var a := Arr(1,3,5,7,9);
    + Writeln(a); // [1,3,5,7,9]
                 

    n-мерный динамический массив выводится так, что каждая размерность заключается в квадратные скобки:.

    var m := new integer[3,3] - ((1,2,3),(4,5,6),(7,8,9));
    writeln(m); // + ((1,2,3),(4,5,6),(7,8,9));
    Writeln(m); // [[1,2,3],[4,5,6],[7,8,9]]

    Динамический массив можно выводить также методом расширения Print или Println:

    diff --git a/PABCNetHelp/LangGuide/Types/sets.html b/PABCNetHelp/LangGuide/Types/sets.html index ff154d25d..c46ec8d06 100644 --- a/PABCNetHelp/LangGuide/Types/sets.html +++ b/PABCNetHelp/LangGuide/Types/sets.html @@ -57,14 +57,21 @@   bs: ByteSet := [1,3,5,20..25];
      fios: StringSet := ['Иванов','Петров','Сидорова'];

    +

    Начиная с версии PascalABC.NET 3.10, при создании множества с помощью [] надо +обязательно указывать тип переменной. Если этого не сделать , то по умолчанию +типом конструкции в [] будет массив:

    +
    +

    var s: set of integer := [1,2,3];
    var + a := [1,2,3]; // array of integer

    +

    Значения в списке могут отсутствовать, тогда множество является пустым:

    bs:=[];

    -

    Пустое множество-константа [] совместимо по присваиванию с множеством любого типа. -Однако тип пустого множества-константы не выводится автоматически:

    +

    Константа [] совместима по присваиванию с множеством любого типа. +Однако тип [] не выводится автоматически:

    -

    var bs:=[]; // Ошибка!

    +

    var s: set of integer := [];
    var
    bs:=[]; // Ошибка!

    Множество, задаваемое конструктором множества, может иметь элементы различных типов, например:

    diff --git a/PABCNetHelp/LangGuide/_ProgrStruct_Defs/constdef.html b/PABCNetHelp/LangGuide/_ProgrStruct_Defs/constdef.html index 1b52e20c8..ae8b10686 100644 --- a/PABCNetHelp/LangGuide/_ProgrStruct_Defs/constdef.html +++ b/PABCNetHelp/LangGuide/_ProgrStruct_Defs/constdef.html @@ -31,11 +31,11 @@   Count = 10;
      Name = 'Mike';
      DigitsSet = ['0'..'9'];
    -   Arr: array [1..5] of integer = (1,3,5,7,9);
    +   Arr: array of integer = (1,3,5,7,9);
      Rec: record name: string; age: integer end = (name: 'Иванов'; age: 23);
    -  Arr2: array [1..2,1..2] of +  Arr2: array of real = ((1,2),(3,4));

     

    diff --git a/PABCNetHelp/LangGuide/_ProgrStruct_Defs/index_progrstruct.html b/PABCNetHelp/LangGuide/_ProgrStruct_Defs/index_progrstruct.html index c4e583394..694cab285 100644 --- a/PABCNetHelp/LangGuide/_ProgrStruct_Defs/index_progrstruct.html +++ b/PABCNetHelp/LangGuide/_ProgrStruct_Defs/index_progrstruct.html @@ -68,11 +68,10 @@ uses, каждая из которых program MyProgram;
    var
      a,b: integer;
    -  x: real;
    begin
    -
      readln(a,b);
    -   x := a/b;
    -   writeln(x);
    +   (a,b) := ReadInteger2;
    +   var x := a/b;
    +   Println(x);
    end.

    или

    @@ -81,6 +80,16 @@ uses, каждая из которых   var x := 100;
      var y := 100;
      var r := 50;
      Circle(x,y,r);
    end.
    +

    Глобальные описания переменных до begin основной программы в основном +используются редко и считаются устаревшим стилем. Глобальные описания переменных +могут использоваться в учебных программах, в которых несколько процедур +используют эти переменные:

    +
    + uses GraphWPF;

    var x: integer;

    + procedure Draw := Circle(x,300,5);

    + begin
    +
      x := 100;
      Draw;
    + end.

    Кроме того, имеется возможность записывать программы без внешнего begin-end. Для этого в начале программы используется префикc ##:

    @@ -91,16 +100,10 @@ uses, каждая из которых секцию uses и описывать процедуры и функции:

    -
    -
    -
    ##
    -uses GraphWPF;
    -function Draw(x,y: real) := Circle(x,y,5);
    -Draw(100,100);
    -
    -
    -
    -

     

    + ##
    +uses GraphWPF;

    +function Draw(x,y: real) := Circle(x,y,5);
    +Draw(100,100);
    diff --git a/PABCNetHelp/LangGuide/_ProgrStruct_Defs/scope.html b/PABCNetHelp/LangGuide/_ProgrStruct_Defs/scope.html index 199e41b86..e97171307 100644 --- a/PABCNetHelp/LangGuide/_ProgrStruct_Defs/scope.html +++ b/PABCNetHelp/LangGuide/_ProgrStruct_Defs/scope.html @@ -39,10 +39,10 @@ конструкции. Так, следующий код корректен:

    var a: array of integer := (3,5,7);
    - for
    i: integer := 1 to 9 do
    -  write(a[i]);
    - foreach i: integer in a do
    -  write(i);

    + for var i := 1 to 9 do
    +  Print(a[i]);
    + foreach var i in a do
    +  Print(i);

    Идентификатор с тем же именем, определенный во вложенном пространстве имен, скрывает @@ -75,14 +75,14 @@ inherited:

    type
    -  A=class
    +  A = class
        i: integer;
        procedure p;
        begin
          i := 5;
        end;
      end;
    -  B=class(A)
    +  B = class(A)
        i: integer;
        procedure p;
        begin
    diff --git a/PABCNetHelp/LangGuide/_ProgrStruct_Defs/vardef.html b/PABCNetHelp/LangGuide/_ProgrStruct_Defs/vardef.html index 5a2403163..22d1f6116 100644 --- a/PABCNetHelp/LangGuide/_ProgrStruct_Defs/vardef.html +++ b/PABCNetHelp/LangGuide/_ProgrStruct_Defs/vardef.html @@ -68,7 +68,7 @@

    Распаковка кортежа в переменные часто используется при возвращении функцией кортежа:

    - function SP(a,b: real) := (a*b,2*(a+b));  
    + function SP(a,b: real) := (a*b, 2*(a+b));  
    ...
    var (S,P) := SP(2,3);
    diff --git a/PABCNetHelp/Table of Contents New.hhc b/PABCNetHelp/Table of Contents New.hhc index b16a390a1..4293ec9af 100644 --- a/PABCNetHelp/Table of Contents New.hhc +++ b/PABCNetHelp/Table of Contents New.hhc @@ -9,881 +9,881 @@
    • - +
      • - +
      • - +
      • - +
      • - +
      • - +
    • - +
      • - +
      • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
      • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
      • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
      • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
      • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
      • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
      • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
      • - +
        • - +
        • - +
        • - +
        • - +
        • - +
      • - +
        • - +
        • - +
      • - +
        • - +
        • - +
        • - +
        • - +
        • - +
      • - +
        • - +
        • - +
        • - +
        • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
          • - +
      • - +
        • - +
      • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        @@ -892,789 +892,769 @@
        • - +
        • - +
        • - +
        • - +
        • - +
      • - +
        • - +
    • - +
      • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
      • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
      • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
      • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
      • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
      • - +
        • - +
        • - +
      • - +
    • - +
      • - +
        • - +
        • - +
        • - +
      • - +
        • - +
        • - +
        • - + -
        • - - - -
        • - - - -
        • - - - -
        • - - - -
        • - - -
      • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
      • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
        • - +
    • - +
      • - +
        • - +
        • - +
      • - +
        • - +
          • - +
        • - +
          • - +
          • - +
        • - +
        diff --git a/Parsers/PascalABCParserNewSaushkin/SemanticRulesForYacc.cs b/Parsers/PascalABCParserNewSaushkin/SemanticRulesForYacc.cs index 86a41e551..3ca65c489 100644 --- a/Parsers/PascalABCParserNewSaushkin/SemanticRulesForYacc.cs +++ b/Parsers/PascalABCParserNewSaushkin/SemanticRulesForYacc.cs @@ -521,7 +521,15 @@ namespace Languages.Pascal.Frontend.Core } expr.source_context.begin_position.line_num = str.source_context.begin_position.line_num; expr.source_context.end_position.line_num = str.source_context.end_position.line_num; - mc.parameters.Add(expr); + + method_call applyO2S = new method_call(); + applyO2S.dereferencing_value = new ident("__ApplyO2S", expr.source_context); + applyO2S.parameters = new expression_list(); + applyO2S.parameters.Add(expr); + applyO2S.source_context = expr.source_context; + + //mc.parameters.Add(expr); + mc.parameters.Add(applyO2S); // добавляем обернутое выражение } mc.source_context = str.source_context; diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt index d94ec171c..0cc1d75df 100644 --- a/Release/pabcversion.txt +++ b/Release/pabcversion.txt @@ -1 +1 @@ -3.11.0.3693 +3.11.0.3699 diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index a45a66584..6827aa8c4 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.11.0.3693' +!define VERSION '3.11.0.3699' diff --git a/TestSuite/CompilationSamples/PABCSystem.pas b/TestSuite/CompilationSamples/PABCSystem.pas index 9092a8d10..750a1d88b 100644 --- a/TestSuite/CompilationSamples/PABCSystem.pas +++ b/TestSuite/CompilationSamples/PABCSystem.pas @@ -72,6 +72,9 @@ const AllDelimiters = ' <>=^`|~$№§!"#%&''()*,+-./:;?@[\]_{}«­·»'#9#10#13; //{{{--doc: Конец секции стандартных констант для документации }}} +// Внутренняя функция для интерполированных строк +///-- +function __ApplyO2S(obj: object): object; ///-- const @@ -2437,6 +2440,7 @@ function CommandLineArgs: array of string; /// Преобразует объект в строковое представление function ObjectToString(obj: object): string; + // ----------------------------------------------------- //>> Подпрограммы для работы с динамическими массивами # Subroutines for array of T // ----------------------------------------------------- @@ -2561,14 +2565,14 @@ function SeqRandomInteger(n: integer := 10; a: integer := 0; b: integer := 100): /// Возвращает последовательность из n случайных вещественных элементов function SeqRandomReal(n: integer := 10; a: real := 0; b: real := 10; digits: integer := 1): sequence of real; /// Возвращает последовательность из count элементов, заполненных значениями f(i) -function SeqGen(count: integer; f: integer->T): sequence of T; +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 перехода от двух предыдущих к следующему -function SeqGen(count: integer; first, second: T; next: (T,T) ->T): sequence of T; +function SeqGen(count: integer; first, second: T; next: (T,T) → T): sequence of T; /// Возвращает последовательность элементов с начальным значением first, ///функцией next перехода от предыдущего к следующему и условием pred продолжения последовательности function SeqWhile(first: T; next: T->T; pred: T->boolean): sequence of T; @@ -5067,6 +5071,13 @@ begin Result := res.ToString; end; +function __ApplyO2S(obj: object): object; +begin + if obj is System.IFormattable then + Result := obj + else Result := ObjectToString(obj); +end; + function NumberFormat(DecimalSeparator: string; GroupSeparator: string): NumberFormatInfo; begin var nfi := new NumberFormatInfo; diff --git a/TestSuite/formatstring8.pas b/TestSuite/formatstring8.pas index c8a2f7e25..8b0f81b36 100644 --- a/TestSuite/formatstring8.pas +++ b/TestSuite/formatstring8.pas @@ -2,5 +2,5 @@ begin var s := $'{f1} {0}'; - assert(s = 'formatstring8.$delegate0 0'); + assert(s = 'function f1(b: byte): integer 0'); end. \ No newline at end of file diff --git a/bin/Lib/PABCSystem.pas b/bin/Lib/PABCSystem.pas index 9092a8d10..750a1d88b 100644 --- a/bin/Lib/PABCSystem.pas +++ b/bin/Lib/PABCSystem.pas @@ -72,6 +72,9 @@ const AllDelimiters = ' <>=^`|~$№§!"#%&''()*,+-./:;?@[\]_{}«­·»'#9#10#13; //{{{--doc: Конец секции стандартных констант для документации }}} +// Внутренняя функция для интерполированных строк +///-- +function __ApplyO2S(obj: object): object; ///-- const @@ -2437,6 +2440,7 @@ function CommandLineArgs: array of string; /// Преобразует объект в строковое представление function ObjectToString(obj: object): string; + // ----------------------------------------------------- //>> Подпрограммы для работы с динамическими массивами # Subroutines for array of T // ----------------------------------------------------- @@ -2561,14 +2565,14 @@ function SeqRandomInteger(n: integer := 10; a: integer := 0; b: integer := 100): /// Возвращает последовательность из n случайных вещественных элементов function SeqRandomReal(n: integer := 10; a: real := 0; b: real := 10; digits: integer := 1): sequence of real; /// Возвращает последовательность из count элементов, заполненных значениями f(i) -function SeqGen(count: integer; f: integer->T): sequence of T; +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 перехода от двух предыдущих к следующему -function SeqGen(count: integer; first, second: T; next: (T,T) ->T): sequence of T; +function SeqGen(count: integer; first, second: T; next: (T,T) → T): sequence of T; /// Возвращает последовательность элементов с начальным значением first, ///функцией next перехода от предыдущего к следующему и условием pred продолжения последовательности function SeqWhile(first: T; next: T->T; pred: T->boolean): sequence of T; @@ -5067,6 +5071,13 @@ begin Result := res.ToString; end; +function __ApplyO2S(obj: object): object; +begin + if obj is System.IFormattable then + Result := obj + else Result := ObjectToString(obj); +end; + function NumberFormat(DecimalSeparator: string; GroupSeparator: string): NumberFormatInfo; begin var nfi := new NumberFormatInfo; diff --git a/bin/PascalABCNET.chm b/bin/PascalABCNET.chm index 21ce99a88..750ae1a03 100644 Binary files a/bin/PascalABCNET.chm and b/bin/PascalABCNET.chm differ