Здравствуйте, Jack128, Вы писали:
J>Здравствуйте, Ikemefula, Вы писали:
I>>Здравствуйте, Sinclair, Вы писали:
I>>>>I>>>> type
I>>>> pProc = procedure(s:string);
I>>>> function X(s:string):pProc;far;
I>>>> procedure X1;far;
I>>>> begin;
I>>>> WriteLn(s);
I>>>> end;
I>>>> begin;
I>>>> X := @X1;
I>>>> end;
I>>>>
S>>>Отличный пример. А что мешает ему скомпилиться? Извини, у меня TP для проверки нету.
I>>Тип pProc можно использовать для параметра, но нельзя для возвращаемого значения, это можно обойти хаком.
I>>>>Ну и мануал, там есть подсказка
S>>>Ну вот в подсказке вроде очень похожий пример. Неужели TP умеет escape-analysis и запрещает передавать адреса вверх по стеку, разрешая вниз?
I>>В этом месте в турбопаскале большая дыра, почти ничем не прикрытая.
J>Сразу говорю — ничего не знаю про класический паскаль, говорю про дельфи(начиная с D3, не знаю, что там раньше было).
J>Так вот, в дельфи — ты сам лично заткнул глотку компилятору, вызвав оператор @.
J>По хорошему нужно писать X := X1; Тогда те компилер скажет, что возвращать ссылку на вложенную процедуру — очень плохо. как только ты взял указатель на процедуру — то с ним ты естественно волен делать что хочешь, указатель — это всего лишь указатель..
И при вызове функции по такому указателю начнуться проблемы. Конкретно в этом примере может всё и прокатит,
поскольку Х1 не использует глобальных переменны, но тогда в чём смысл делать эту функцию локальной?

А вся прелесть лямбд в том, чтобы передать указатель на лямбду в качестве параметра некоторого алгоритма,
который принимает указатель на функцию. Так вот в Паскале и в Дельфи брать указатели на вложеные функции НЕЛЬЗЯ.