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

Здраствуйте, я можно сказать случайным образом нашел в модуле GraphWPF функцию Redraw(), которая в документации не описана. Ее назначение - процедура синхронизация вывода графики. Если мы откроем справочный файл по данному модулю, то найдем функцию invoke() с таким же описанием, но есть проблема. Этой функции просто нет, даже уже написав ее в редакторе не видно никаких подсказок. Когда запускаешь программу, выдается ошибка, о том что invoke неизвестное имя.

То есть вопрос в чем: Почему в документации есть нерабочая функция Invoke() и нет функции redraw()?

А по моему Invoke в Redraw переименовали, а справку исправить забыли.

Было бы плохо если бы анализатор кода не был бы согласен с компилятором. Тогда это, скорее всего, был бы баг.

Ну да, вот:

15 дней назад @Admin специально переименовал, и коммит имеет соответствующее имя.

Залил версию с обновленным Helpом

У .pas-файлов не высококачественные иконки:

У меня такие:

Попробуйте перепоставить систему в другую папку. У меня как-то исправилось именно после этого

1 лайк

_ как имя переменной - уже зарезервированно в паттерн мачинге. Может сразу добавить такой же функционал как в паттерн мачинге и C#?

type
  t1 = class
    static property p1: byte read 0;
  end;

begin
  var _ := t1.p1; // вызов t1.get_p1 и выкидывание результата
end.

Я не считаю, что это нужно. Паттерн-матчинг - довольно узкая вещь, туда мало кто полезет. А это будет маячить в ядре языка.

Да нет же, это не часть паттерн мачинга. Я говорю - всё что уже задело бы функционал ядра уже есть:

А фича с удалением результата свойства - это не что то локальное как паттерн мачинг. Это может понадобится в повседневной жизни в любой момент.

Не буду с вами спорить.

1 лайк
type
  T = class
  end;
  
function operator+(var x, y: T); extensionmethod := default(T);
procedure operator+=(var x, y: T); extensionmethod := exit;

function operator-(var x, y: T); extensionmethod := default(T);
procedure operator-=(var x, y: T); extensionmethod := exit;

function operator*(var x, y: T); extensionmethod := default(T);
procedure operator*=(var x, y: T); extensionmethod := exit;

function operator/(var x, y: T); extensionmethod := default(T);
procedure operator/=(var x, y: T); extensionmethod := exit;

function operator mod(var x, y: T); extensionmethod := default(T);

function operator div(var x, y: T); extensionmethod := default(T);

function operator=(var x, y: T); extensionmethod := false;
function operator<>(var x, y: T); extensionmethod := false;

function operator<(var x, y: T); extensionmethod := false;
function operator<=(var x, y: T); extensionmethod := false;

function operator>(var x, y: T); extensionmethod := false;
function operator>=(var x, y: T); extensionmethod := false;

// Недопустимо использование var в первом параметре extension-метода
//function ExtensionA(var self, y: T); extensionmethod := default(T);
//procedure ExtensionB(var self, y: T); extensionmethod := exit;

begin
end.

Хотелось бы выяснить причину данного запрета (для себя). Код выше доказывает то, что в операторах расширения var параметры разрешены, в отличии от процедур и функций расширения.

У операторов это разрешено для += и т.п. А у extensionmethod - было бы видно, если бы вы правильно их написали:

//function ExtensionA(var self: T; y: T); extensionmethod := default(T);
//procedure ExtensionB(var self: T; y: T); extensionmethod := exit;

self := противоречит ООП. Хотя звучит это и для меня немного сомнительно…

Нет. Такое использование и не предполагалось. Предполагался, следующий код:

type
  T = record
    public X: integer;
  end;
  
procedure Change(var self: T); extensionmethod := self.X := 2;

begin
end.

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

1 лайк

self.X := 2;

Это оператор, а их присваивать можно только коротким процедурам

Но вот здесь всё-таки должно выводиться 2, а потому нужен var:

type
  T = record
    public X: integer;
  end;
  
procedure Change({var} self: T); extensionmethod := self.X := 2;

begin
  var v := new T;
  v.Change;
  v.X.Print;//0
end.

@Admin может неявно делать self - var-параметром, если у него размерный тип? Тогда extensionmethod-ы будут работать так же как просто методы в случае записей.

@MrFresnel как это в C# работает, кстати?

В C#:

  • параметры операторов могут иметь только модификатор: in.
  • параметр this методов расширения не может иметь модификаторов: ref, in и out. На остальные параметры, разумеется, ограничений не накладывается.

Вопрос был про реакцию метода расширения на структуру

Ы, кстати, я закомментировал тот запрет в SyntaxTreeVisitor и всё работает)))

Так что могу лишь повторить знаменитую фразу серёги: “В C# полно тупых запретов”))))

Мы можем продолжить тот, как Вы выразились, срач, если хотите. Но надо ли это Вам и мне? Нет, не думаю, да и форум засорять…

Я кинул эту цитату не для того, чтобы Вы намекали на продолжение срача.

И да, кстати, я так и не понял (мы так и не поняли), почему ты тогда так загорелся? Я всё лето думал и понять не мог…