понедельник, 29 июля 2013 г.

Почему же Embarcadero сделала "анонимные" функции, но не сделала приведение локальных процедур к ПОЛНОЦЕННЫМ лямбдам?

Жаль кстати, что в Embarcadero - НЕДОДУМАЛИ и не додумались дать возможность превратить в ЛЯМБДЫ - ЛЮБЫЕ ЛОКАЛЬНЫЕ процедуры и функции. Очень жаль :-( Там же на самом деле - всё просто. Если бы я писал бы компилятор - я бы ОБЯЗАТЕЛЬНО бы это сделал. Там же по месту вызова на уровне компилятора МОЖНО "сварить" обёртку над локальной функцией. ЗАВЕРНУТЬ её вызов - в анонимную функцию. Чтобы она стала ПОЛНОЦЕННОЙ лямбдой. Там - ОДИН ШАГ. Ну просто - 5 мин на правку компилятора. А скорее "препроцессора".

procedure CallInner (aProc : reference to procedure);
begin
 aProc;
end;

procedure A;

 procedure Inner;
 begin
 end;

begin
 ...
 CallInner(@Inner);
end;

превращаем в:

procedure A;

 procedure Inner;
 begin
 end;

begin
 ...
 CallInner(procedure begin Inner end;);
end;

ВСЁ!!!

Даже компилятор править не надо. ТОЛЬКО - "препроцессор". А сколько "геморроя" - снимется.

P.S. Как в 32-х битах это делать - в общем-то - всё понятно - http://18delphi.blogspot.com/2013/03/blog-post_5929.html. А вот - 64 бита - вызывают вопросы :-( Ну не знаю я 64-х битного ассемблера :-(

Комментариев нет:

Отправить комментарий