Жаль кстати, что в 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-х битного ассемблера :-(
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-х битного ассемблера :-(
Комментариев нет:
Отправить комментарий