Лекс Айрин писал(а):А может, ну ее эту магию? Может мы просто не тем путем идем? Может надо подумать как раз над оригинальными и действительно нужными средствами?
Ну так если были бы необходимые средства в языке, то и часть магии была бы не нужна. В дельфях, с появлением avanced records и перегрузки операторов, просят добавить возможность перегружать операторы для инициализации/финализации и копирования. Сейчас всё это является компиляторной магией, а будь они доступны в языке, то все управляемые типы можно было бы перенести в RTL и вместо насильного впендюривания ARC на уровень базового класса можно было бы сделать безопасные смартпоинтеры с минимальным оверхедом.
Лекс Айрин писал(а):перенос компиляторной магии на уровень языка мало что изменит
Шутишь что-ли? Это как раз сильно увеличивает возможности языка. Будь это реализовано, любой желающий давно мог бы использовать те же смартпоинтеры без необходимости ждать, когда их или аналогичную возможность допилят в компиляторе.
Добавлено спустя 3 минуты 2 секунды: Ещё забыл добавить, что это позволило бы снизить издержки на работу финализаторов, которые на сегодняшний день для работы используют RTTI.
procedure SomeFunc; var A1: LongInt; A2: AnsiString; A3: BalBlaBla; Callback: TCallback; begin Callback := procedrue; // Записываем в переменную процедуру begin Writeln(A1, ' ', A2, ' ', A3); // Сразу видим что эта процедура делает end; RunAlgo(Callback); // Передаём коллбэк // Код читается сверху вниз с одного захода end;
procedure SomeFunc; var A1: LongInt; A2: AnsiString; A3: BalBlaBla; // Что это за класс? Надо лезть в описание класса MyCallbackWrapper: TMyCallbackWrapper; begin // Что делает конструктор? Надо сходить в то места, где конструктор реализован MyCallbackWrapper := TMyCallbackWrapper.Create(A1, A2, A3); RunAlgo(MyCallbackWrapper.Callback); // Передаём коллбэк MyCallbackWrapper.Free; end;
...
// Лезем в описание класса, видим: type TMyCallbackWrapper = class private FA1: LongInt; FA2: AnsiString; FA3: BalBlaBla; public constructor Create(A1: LongInt; A2: AnsiString; A3: Blablabla); procedure Callback; end; // Супер — прочли 10 механически написанных строк
Дож писал(а):Callback := procedrue; // Записываем в переменную процедуру begin Writeln(A1, ' ', A2, ' ', A3); // Сразу видим что эта процедура делает end;
А как вот это назвать? Печатных слов нет. Или вы пишите код 1 раз и в последующем его не спровождаете вообще? Или это будет потом наказание для провинившихся? НАФИГ... НАФИГ...
Дож, колбек, как я понимаю, это обычное присваивание адресной переменной (указателю) адреса функции для ее дальнейшего использования... почему бы не делать так, как это делают все нормальные программисты? Обычным взятием адреса?
//Процедура обработки оконных сообщений Function WindowProc(wnd:HWND; Msg : Dword; Wparam:Wparam; Lparam: Lparam): Lresult; stdcall; // // заменил integer на DWord и все заработало))) begin case msg of wm_destroy, wm_close : postquitmessage(0); //Событие закрытия или удаления окна else Result := DefWindowProc(wnd, msg, wparam, lparam); end; end;
//Процедура регистрации класса основного окна Procedure RegWinClass; Var wc: WNDCLASS; err: dword;