Re[58]: Как мало людей понимает ООП...
От: icWasya  
Дата: 19.08.12 09:55
Оценка:
Здравствуйте, 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 не использует глобальных переменны, но тогда в чём смысл делать эту функцию локальной?
А вся прелесть лямбд в том, чтобы передать указатель на лямбду в качестве параметра некоторого алгоритма,
который принимает указатель на функцию. Так вот в Паскале и в Дельфи брать указатели на вложеные функции НЕЛЬЗЯ.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.