Замечания и предложения

type
  T0 = class
  public
    auto property X: integer;
  end;
  
  T1 = class
  private
    instance: T0;

  public
    property X: integer read instance.X write instance.X; // Program3.pas(11) : Ожидалось имя процедуры или функции
  end;
  
begin
end.

Это адекватная реакция компилятора?

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

1 лайк

А есть ли что то плохое в том чтоб расширить старый синтаксис тут?

1 лайк

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

1 лайк

Вопрос внутри кода

{$reference 'System.Windows.Forms.dll'}
{$reference 'System.Drawing.dll'}

uses 
  System, System.Windows.Forms, System.ComponentModel;


procedure SomeClosing(s: object; e: FormClosingEventArgs);
begin
  writeln('выполнилось');
end;


begin
  var MainForm := new Form;
  MainForm.FormClosing += SomeClosing;
  
  // Как мне тут удалить все делегаты из MainForm.Closing не используя имя SomeClosing. (т.е. так нельзя MainForm.Closing -= SomeClosing;)
  // в C# это делается приравниванием к null
  // MainForm.Closing := nil; но тут ошибка
  
  Application.Run(MainForm);
end.

Никак. И даже если бы можно было - это говнокод. Правильно - выбирать поведение в SomeClosing, через if, или лучше case.

Это не очень хороший выход из ситуации (не зависимо от языка). Может, например, возникнуть потребность вернуть всё как было - до приравнивания к null. То есть, придётся каким-то образом добавлять всё обратно. Это - лишняя работа. Лучше хранить, например, в какой-то переменной типа bool флаг, указывающий используются ли делегаты из MainForm.Closing или нет. В виде кода:

    /// <summary>
    /// Какой-то класс.
    /// </summary>
    public class MyClass
    {
        /// <summary>
        /// Событие.
        /// </summary>
        public event Action Event;

        /// <summary>
        /// Метод, вызывающий событие.
        /// </summary>
        public void Method()
        {
            // Какой-то код.
            Event?.Invoke();
            // Какой-то код.
        }
    }

    internal class Program
    {
        private static bool flag;

        private static void MethodA()
        {
            if (!flag)
                return;
            // Какой-то код.
        }

        private static void MethodB()
        {
            if (!flag)
                return;
            // Какой-то код.
        }

        private static void Main(string[] args)
        {
            MyClass x = new MyClass();
            x.Event += MethodA;
            x.Event += MethodB;
            Flag = true;
            x.Method(); // Действия из MethodA, MethodB - выполняются.
            Flag = false;
            x.Method(); // Никаких действий не произойдёт.
        }
    }

, либо:

    internal class Program
    {
        private static bool flag;

        private static void MethodA()
        {
            // Какой-то код.
        }

        private static void MethodB()
        {
            // Какой-то код.
        }

        public static void MainMethod()
        {
            if (!flag)
                return;
            MethodA();
            MethodB();
        }

        private static void Main(string[] args)
        {
            MyClass x = new MyClass();
            x.Event += MainMethod;
            Flag = true;
            x.Method();
            Flag = false;
            x.Method();
        }

В pabcnetc копирайт до сих пор 2018)

image

Откатил правки Kotov - т.к. GenerateAllSetups перестал собирать инсталлят

1 лайк

Это не про то, что я писал в свое время? :stuck_out_tongue_winking_eye:

1 лайк

Проверьте еще раз - запустите GenerateAllSetups - и сделайте pull request повторно.

1 лайк

Но если окажется, что это действительно из-за меня (что вряд ли), то извините, пожалуйста, за неудобства(…

Ну не вряд ли… В следующий раз (чего я, конечно, постараюсь не допустить, буду всегда запускать тесты) можете скинуть скриншот с ошибкой TestRunner? Я бы просто поправил баг и всё. Это было бы гораздо быстрее.

Вот в чём была проблема: тип констант enum’а может быть не только int, из-за чего преобразование к int и ломалось.

Сделал pull request. Все тесты прошло.

@Admin, а быть может, всё-таки, реализуете это? Я бы и сам рад, только мне страшно туда лезть. Таблица символов, парсер, ну нафиг. Да я так и не понял, почему энумы вообще не сворачиваются, если в VisualPascalABCNET\IB\CodeCompletion\FoldingStrategy.cs идёт проход по всем классам, реализующим ITypeScope, а EnumScope реализует его наследника.

MrFresnel тогда напостил кучу issue-хотелок, которые вы закрыли, но среди них реально такая нужная вещь затерялась. Тому же SunSerega будет в разы удобнее работать над OpenCL, если он те свои огромные энумы сворачивать сможет))

1 лайк

Я энумэ сделал велосипедными, через записи, потому что:

  1. Часть из них должна быть реализована на IntPtr/int64, а не на integer.
  2. Стандартные энумы заполняют мусором основное пространство имён.
  3. Есть пара мест, где нужны особые фичи, вроде:

    public static function operator implicit(ec: ErrorCode): CommandExecutionStatus :=
    new CommandExecutionStatus(ec.val);
    

Да, в целом - сворачивание энумов мне уже нужно было. Но в OpenCL оно ни к чему.

Понимаю, что реально нужно, но в редактор мне страшно лезть самому. Я - специалист по компиляторам и языкам.

1 лайк

Вот такая вот проблемка в модуле GraphWPF. А если еще проверку сделать Return = Enter то это истина.

Так это одно и то же

1 лайк

сделал. ждите обновлений

2 лайка

PABCSystem, строки 1923-1926:

/// Возвращает двумерный массив размера m x n, заполненный элементами x 
function MatrFill<T>(m, n: integer; x: T): array [,] of T;
/// Возвращает двумерный массив размера m x n, заполненный элементами x 
function MatrGen<T>(m, n: integer; gen: (integer,integer)->T): array [,] of T;

Описание MatrGen тупо скопипасчено с MatrFill. Но у MatrGen нет никакого x, поэтому это описание ему не подходит.

unit __RedirectIOMode;

//------------------------------------------------------------------------------
// Модуль подключаемый в режиме запуска со связью с оболочкой                  
// (с) DarkStar 2007
// Функции:
//    1. Посылка в поток ErrorStream сигнала [READLNSIGNAL]
//    2. Перехват исключений по AppDomain.CurrentDomain.UnhandledException и 
//       пердача их в поток ErrorStream // может быть "передача"?
//    3. Перехват исключений по Application.ThreadException и 
//       пердача их в поток ErrorStream // "передача" ?
//------------------------------------------------------------------------------

Это опечатка? Нужно ли исправлять?