Локальные лямбды. Proof of concept

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Re: Локальные лямбды. Proof of concept

Сообщение MageSlayer » 03.08.2010 21:52:33

Ну, что, дамы и господа, похоже лед тронулся. В свежих ревизиях fpc 15656 и 15695 появилась поддержка nested функций.
http://svn.freepascal.org/cgi-bin/viewv ... sion=15656
http://svn.freepascal.org/cgi-bin/viewv ... sion=15695

Теперь можно начинать использовать вложенные функции, так как они изначально задумывались.
Например:
Код: Выделить всё
program project1;

{$mode objfpc}{$H+}
{$modeswitch nestedprocvars} // вот оно!

type
  TLocalProc = procedure is nested;

procedure Proc2(L:TLocalProc);
var n:Integer;
begin
  for n:=0 to 10 do
    L;
end;

procedure Proc;
var i:Integer;

procedure LocalProc;
begin
  WriteLn(i);
  Inc(i);
end;

begin
  i:=0;
  Proc2(@LocalProc);
end;

begin
  Proc;
end.


FPC начинает превращаться в нормальный функциональный язык :)
Всем мои поздравления!
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Re: Локальные лямбды. Proof of concept

Сообщение Иван Шихалев » 03.08.2010 23:18:49

Мда. Круто. Я в последнее время Ruby изучаю — оценил прелести.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1140
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: Локальные лямбды. Proof of concept

Сообщение alexrayne » 04.08.2010 02:39:17

IMHO, всетаки имитация\адаптация вложеных процедур методами объекта более заманчива ибо тогда можно передавать локальные процедуры как методы в качестве параметров.
тобиш

type
Notifier = procedure( A : byte) of object;

procedure Filter(value : byte; iterator: Notifier);
begin
....
end;

procedure some;
procedure LocalIterator(A: byte)
begin
Filter(xxx, LocalIterator);
end;

весь смак в том что фильтру можно по идее передавать и метод объекта и локальную процедуру. и ето все ничего нестоит.
а вот с тем что намутили в вышеуказаных новых версиях имеем
1) лишние навороты языка (именно синтаксиса языка, а не просто в РТЛ пару виртуальных функций добавить) причем неподдержаные дельфей (она ведь стандарт дефакто), и ето вместо того чтобы язык упрощать, имхо Вирт бы неодобрил
2) вышеописаная возможность использовать локальные процедуры в качестве методов тут отсутствует.

Вот думаю Горелкину тут бы както среагировать, подсказать каким образом можно поучаствовать в обсуждении нововведения nested процедур с разработчиками. или тут как я понимаю получится как и генериками?
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

Re: Локальные лямбды. Proof of concept

Сообщение Sergei I. Gorelkin » 04.08.2010 06:52:19

Как я понял, никто ничего не придумывал, а просто реализовали то, что предусмотрено диалектами MacPas и ISO7195.
Что касается общения с разработчиками - все способы вроде бы известны и не изменялись...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1384
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Локальные лямбды. Proof of concept

Сообщение MageSlayer » 04.08.2010 09:51:30

alexrayne писал(а):весь смак в том что фильтру можно по идее передавать и метод объекта и локальную процедуру. и ето все ничего нестоит.
а вот с тем что намутили в вышеуказаных новых версиях имеем
1) лишние навороты языка (именно синтаксиса языка, а не просто в РТЛ пару виртуальных функций добавить) причем неподдержаные дельфей (она ведь стандарт дефакто), и ето вместо того чтобы язык упрощать, имхо Вирт бы неодобрил

Стоит только какой-нибудь коммерческой компашке выкатить реализацию чего-нибудь под Винду и все, они уже стандарт дефакто. Браво.
alexrayne писал(а):2) вышеописаная возможность использовать локальные процедуры в качестве методов тут отсутствует.

Собственно, а кто мешает перегрузить Filter с разными типами аргументов и получить в итоге тоже самое?
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Re: Локальные лямбды. Proof of concept

Сообщение alexrayne » 04.08.2010 11:01:45

MageSlayer писал(а):Стоит только какой-нибудь коммерческой компашке выкатить реализацию чего-нибудь под Винду и все, они уже стандарт дефакто. Браво.

а Вы можете подсказать какогото конкурента дельфе такогоже распространенного и изучаемого? если зайти в книжный магазин то Вы увидете там только книги по реализациям паскалей от борланда - по дельфе и турбо. по другим паскалям я в жизни невидел литературы. это Вам не знак?
MageSlayer писал(а):Собственно, а кто мешает перегрузить Filter с разными типами аргументов и получить в итоге тоже самое?

Вы пошутили? это типо нормально дублировать одну и туже процедуру с разными но одинковыми типами?
если Вы кинете тему в сторону генериков - я пробовал пользоваться шаблонами в С++ - это удобно только когда кода шаблонного много или типов для шаблонирования много. если надо сделать по шаблону одну маленькую процу для 2х типов - получается много строк кода неочевидного. и вдобавок это лишний ненужный код в итоговом образе - расход памяти программ и удар по кешу.

Ну а если процедура фильтра приватная в чужом модуле? Вы что думаете можно будет сделать врапер и какимто образом конвертнуть вложеную процедуру в метод?
В итоге для таких случаев всеравно придется делать объекты с методами в локальнм стеке.....

Добавлено спустя 1 минуту 12 секунд:
Sergei I. Gorelkin писал(а):Как я понял, никто ничего не придумывал, а просто реализовали то, что предусмотрено диалектами MacPas и ISO7195.
Что касается общения с разработчиками - все способы вроде бы известны и не изменялись...


киньте сцылко на есть форум обсуждения этой затеи, или это нигде необсуждалось?
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

Re: Локальные лямбды. Proof of concept

Сообщение Odyssey » 04.08.2010 13:31:53

Разработчики обычно пользуются списками рассылки и вики. Например, generic'и обсуждались в том числе тут. Обсуждались ли локальные процедуры/функции и где -- не знаю, думаю имеет смысл начать с рассылки.
Odyssey
энтузиаст
 
Сообщения: 581
Зарегистрирован: 29.11.2007 17:32:24

Re: Локальные лямбды. Proof of concept

Сообщение MageSlayer » 04.08.2010 14:30:23

alexrayne писал(а):
MageSlayer писал(а):Стоит только какой-нибудь коммерческой компашке выкатить реализацию чего-нибудь под Винду и все, они уже стандарт дефакто. Браво.

а Вы можете подсказать какогото конкурента дельфе такогоже распространенного и изучаемого? если зайти в книжный магазин то Вы увидете там только книги по реализациям паскалей от борланда - по дельфе и турбо. по другим паскалям я в жизни невидел литературы. это Вам не знак?

[/quote]
Я конечно извиняюсь, но то, что вы перечислили обычно просто говорит об успешном (думал брать в ковычки) бизнес-продукте/модном веянии/..., а не о стандарте.
Обучение/изучение в этом мире подразумевает инвестиции в себя, а не в тот хлам что лежит на полках магазинов.

alexrayne писал(а):
MageSlayer писал(а):Собственно, а кто мешает перегрузить Filter с разными типами аргументов и получить в итоге тоже самое?

Вы пошутили? это типо нормально дублировать одну и туже процедуру с разными но одинковыми типами?
если Вы кинете тему в сторону генериков - я пробовал пользоваться шаблонами в С++ - это удобно только когда кода шаблонного много или типов для шаблонирования много. если надо сделать по шаблону одну маленькую процу для 2х типов - получается много строк кода неочевидного. и вдобавок это лишний ненужный код в итоговом образе - расход памяти программ и удар по кешу.

И не думал шутить. Добрая половина текущего проекта генерируется из m4. Лишние функции удаляются линковщиком. Для этого он и предназначен. В итоге соотношение [написанного вручную полезного кода]/[boilerplate] приближается к лиспу, APL и т.д.

Вы это тестировали по поводу кэша или где-то услышали?
Или может у вас уже сейчас компилятор угадывает ваши мысли и специально располагает все ваши горячие (в смысле профилировки) функции как можно ближе чтобы кэшу было полегче? И знает о параметрах кэша на машинах, где это будет крутиться?
Скажите что за компилятор, я тоже такой хочу, а то может зря я сам на асме такое пишу.

alexrayne писал(а):Ну а если процедура фильтра приватная в чужом модуле? Вы что думаете можно будет сделать врапер и какимто образом конвертнуть вложеную процедуру в метод?

См. выше. Макросы m4 для меня решают такие задачи.
По сравнению с грузом мертвого кода компонент, затраты на раскопирование кода - это мелочи не видные невооруженным глазом.
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Re: Локальные лямбды. Proof of concept

Сообщение alexrayne » 04.08.2010 15:55:21

MageSlayer писал(а):Я конечно извиняюсь, но то, что вы перечислили обычно просто говорит об успешном (думал брать в ковычки) бизнес-продукте/модном веянии/..., а не о стандарте.

Вы пытаетесь мне доказать что существует только стандарт де юре, а де факто неподдержаное юридически есть глупости. слово стандарт я трактую как нечто общепринятое к употреблению а не как нечто поддержаное лицензиями патентами или както еще юридически, с этой позиции Ваши наезды дельфу - отрицание реальности.

На сях я пишу для встроенных систем с очень жестоким ограничением по памяти (кеша там кстати нет) и внимательно приходится следить за каждые 10-16 байт (а оно еще и медленное посему приходится код еще и жестоко оптимизировать - лишние обертки для процедур обходятся дорого). такчто как работает линковщик и инсталяция шаблонов представление имею и иллюзий по поводу ума компилятора неиспытываю.

MageSlayer писал(а):Добрая половина текущего проекта генерируется из m4.

расскажите подробнее плиз что ето такое, сцылко киньте.
MageSlayer писал(а):Или может у вас уже сейчас компилятор угадывает ваши мысли и специально располагает все ваши горячие (в смысле профилировки) функции как можно ближе чтобы кэшу было полегче? И знает о параметрах кэша на машинах, где это будет крутиться?

ессно неугадывает, но если Вам придется поочередно\смешанно вызывать локальную процедуру и ее аналог-метод то ненужно быть 7пядей во лбу чтобы понять что оно займет ровно в2раза больше кеша. Ессно ето случай больно замудреный но, имхо, не невозможный.

едиснственный способ избежать этого я вижу в том чтобы компилер понимал что метод и локальная процедура имеют одинаковый формат вызова (а оно так и есть, по крайней мере компилятор может этого добится и гарантировать).
Odyssey писал(а):См. выше. Макросы m4 для меня решают такие задачи.

какие такие задачи? каким способом вы конвертнете процедуру is nested в of object?
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

Re: Локальные лямбды. Proof of concept

Сообщение MageSlayer » 04.08.2010 16:23:55

alexrayne писал(а):
MageSlayer писал(а):Я конечно извиняюсь, но то, что вы перечислили обычно просто говорит об успешном (думал брать в ковычки) бизнес-продукте/модном веянии/..., а не о стандарте.

Вы пытаетесь мне доказать что существует только стандарт де юре, а де факто неподдержаное юридически есть глупости. слово стандарт я трактую как нечто общепринятое к употреблению а не как нечто поддержаное лицензиями патентами или както еще юридически, с этой позиции Ваши наезды дельфу - отрицание реальности.

Что-то Дельфей под никсы я пока не наблюдаю. Мы живем в разных реальностях?
Нет, есть только то, что позволяет решать проблемы. И если, что-то открытое позволяет мне решать проблемы эффективнее, то я считаю его стандартом, а не то о чем кричат больше.

alexrayne писал(а):На сях я пишу для встроенных систем с очень жестоким ограничением по памяти (кеша там кстати нет) и внимательно приходится следить за каждые 10-16 байт (а оно еще и медленное посему приходится код еще и жестоко оптимизировать - лишние обертки для процедур обходятся дорого). такчто как работает линковщик и инсталяция шаблонов представление имею и иллюзий по поводу ума компилятора неиспытываю.

Мои соболезнования.
Опять же замыканий в стандарте де-факто/де-юре для С, я что не припомню.

alexrayne писал(а):
MageSlayer писал(а):Добрая половина текущего проекта генерируется из m4.

расскажите подробнее плиз что ето такое, сцылко киньте.

Очень старый, надежный и быстрый текстовый препроцессор. http://www.gnu.org/software/m4/
Странно, что с таким опытом на сях, вы о нем не слышали. Autoconf - его использует и добрая половина никсовых проектов.

alexrayne писал(а):
MageSlayer писал(а):Или может у вас уже сейчас компилятор угадывает ваши мысли и специально располагает все ваши горячие (в смысле профилировки) функции как можно ближе чтобы кэшу было полегче? И знает о параметрах кэша на машинах, где это будет крутиться?

ессно неугадывает, но если Вам придется поочередно\смешанно вызывать локальную процедуру и ее аналог-метод то ненужно быть 7пядей во лбу чтобы понять что оно займет ровно в2раза больше кеша. Ессно ето случай больно замудреный но, имхо, не невозможный.

Вот и я про то же.
"ровно в 2 раза больше кэша" - эта фраза в принципе смысла не имеет, все зависит от того как организован кэш и собрано приложение. Арифметически меньше уже давно не значит автоматически лучше. Количество развернутых вручную циклов в fpc лишнее тому подтверждение.

alexrayne писал(а):едиснственный способ избежать этого я вижу в том чтобы компилер понимал что метод и локальная процедура имеют одинаковый формат вызова (а оно так и есть, по крайней мере компилятор может этого добится и гарантировать).

И он, и разработчики компилятора это и так уже понимают :). Вы наверное хотели сказать, чтобы синтаксис и метода и локальной функции был одинаковым. Дык товарищ, который изначально создал тикет в багтрекере о этом говорил. Но не срослось :)

alexrayne писал(а):
MageSlayer писал(а):См. выше. Макросы m4 для меня решают такие задачи.

какие такие задачи? каким способом вы конвертнете процедуру is nested в of object?

Текстовым препроцессором m4. Попробуйте, может понравится :).
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Re: Локальные лямбды. Proof of concept

Сообщение alexrayne » 04.08.2010 16:45:07

alexrayne писал(а):Текстовым препроцессором m4. Попробуйте, может понравится .

Это интригует.
Уточняю вопрос, ибо сдаеца мне я недостаточно подробно изложил проблему:
некий сторонний товарищ подал вам из благих намерений скомпиленый объектник своего модуля+паскалевский интерфейс(ppu или вроде того). или dll хитрую. ну не весь мир еще работает с исходным кодом. (а может и весь, но у вас нет под рукой инструментария и времени чтобы перекомпилить чужую библиотеку). в этой библиотеке некоемой функции скажем поиска надо передать метод-итератор. ну и как вы макропроцессором пеередадите локальную процедуру ему вместо метода?

Добавлено спустя 17 минут 54 секунды:
MageSlayer писал(а):Очень старый, надежный и быстрый текстовый препроцессор. http://www.gnu.org/software/m4/Странно, что с таким опытом на сях, вы о нем не слышали. Autoconf - его использует и добрая половина никсовых проектов.


спосибо что напомнили мне где я видел это чудо. просто поимев возни с компиляцией под ГНУ я понял что простая виндовая дельфа и фрюха мне таки роднее. ибо когда компиляция неахки какого навороченого проекта начинает занимать минуты- десятки минут. это нервирует. впротивовес ГНУсной системе маке\autoconf компиляция проекта во фрюхе\дельфе за секунды (более минуты редкий случай) впринципе меняет подход к отладке и устранению ошибок.
Вобчем невпечатляет меня м4, предпочитаю обходится тем что предоставляет компилер как таковой. пока хватало.

MageSlayer писал(а):Вот и я про то же. "ровно в 2 раза больше кэша" - эта фраза в принципе смысла не имеет, все зависит от того как организован кэш и собрано приложение. Арифметически меньше уже давно не значит автоматически лучше. Количество развернутых вручную циклов в fpc лишнее тому подтверждение.

Ну и какие виды организации кеша вы практически встречали? везде где я знаю используется один и тотже прицип разница только в размерах ассоциативности, размерах строк, и объеме. и как никрутись думать об эффективности его использования временами надо. если на это забивать то зачем вообще обсуждать кеш?
а разворачивание циклов ето вообчето совсем другая песня не к этой теме она.

MageSlayer писал(а):Дык товарищ, который изначально создал тикет в багтрекере о этом говорил. Но не срослось

дайте сцылко на тикет или хоть как приблизительно тема называлась.
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

Re: Локальные лямбды. Proof of concept

Сообщение MageSlayer » 04.08.2010 17:03:13

alexrayne писал(а):
alexrayne писал(а):Текстовым препроцессором m4. Попробуйте, может понравится .

Это интригует.
Уточняю вопрос, ибо сдаеца мне я недостаточно подробно изложил проблему:
некий сторонний товарищ подал вам из благих намерений скомпиленый объектник своего модуля+паскалевский интерфейс(ppu или вроде того).

Такие нам не товарищи :).
Кроме того, ppu распространять крайне неприятно. Компилятор свежей версии может не понять юмора :)

alexrayne писал(а):или dll хитрую. ну не весь мир еще работает с исходным кодом. (а может и весь, но у вас нет под рукой инструментария и времени чтобы перекомпилить чужую библиотеку).

Неправда. Весь :)
Время компилировать у меня есть. Я - гентушник :)))

alexrayne писал(а):в этой библиотеке некоемой функции скажем поиска надо передать метод-итератор. ну и как вы макропроцессором пеередадите локальную процедуру ему вместо метода?


Если уж меня так торкнет, чтобы таким пользоваться, то просто напишу макрос-обертку на m4 с принудительным приведением типов/проверкой компилятора/ассемблерной вставкой/...
Вообще я предпочитаю изолировать код, от которого собираюсь в ближайшее отказываться :)

alexrayne писал(а):спосибо что напомнили мне где я видел это чудо. просто поимев возни с компиляцией под ГНУ я понял что простая виндовая дельфа и фрюха мне таки роднее. ибо когда компиляция неахки какого навороченого проекта начинает занимать минуты- десятки минут. это нервирует. впротивовес ГНУсной системе маке\autoconf компиляция проекта во фрюхе\дельфе за секунды (более минуты редкий случай) впринципе меняет подход к отладке и устранению ошибок.
Вобчем невпечатляет меня м4, предпочитаю обходится тем что предоставляет компилер как таковой. пока хватало.

Пожалуйста.
Только может объясните, какое отношение скорость препроцессора имеет к скорости запуска скрипта конфигурации?
В общем, пока вы не поняли, где там m4 и зачем он нужен.
Родная дельфовая? Это какая? Дотнетовская поделка MS Build что ли? Не смешите.

alexrayne писал(а):Ну и какие виды организации кеша вы практически встречали? везде где я знаю используется один и тотже прицип разница только в размерах ассоциативности, размерах строк, и объеме. и как никрутись думать об эффективности его использования временами надо. если на это забивать то зачем вообще обсуждать кеш?
а разворачивание циклов ето вообчето совсем другая песня не к этой теме она.

Вам этого мало?
Разворачивание циклов - это то, с чего начали. Оптимизация циклов-несколько вариантов процедур-проблема с кэшем.
Думать о таких проблемах будем когда они будут возникать.

alexrayne писал(а):дайте сцылко на тикет или хоть как приблизительно тема называлась.

http://bugs.freepascal.org/view.php?id=15925
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Re: Локальные лямбды. Proof of concept

Сообщение alexrayne » 04.08.2010 22:13:23

Да действительно, мысль об идентичности методов и локальных процедур проскочила но неразвилась както. жаль однако 8(. остаеца надеятся что в отдаленном будущем, когда космические корабли разбороздят просторы наших театров, эта задача небудет занимать умы человеков.
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

Re: Локальные лямбды. Proof of concept

Сообщение Иван Шихалев » 04.01.2011 14:19:38

Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1140
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: Локальные лямбды. Proof of concept

Сообщение MageSlayer » 04.01.2011 16:08:18

Почитал. Улыбнулся.
Имхо, это не соображения. Это вечная тема: почему язык X - не Common Lisp/Scheme/APL и т.п.

Где конкретные предложения относительно Паскаля/FPC?
Решение части проблем уже есть и запланировано разработчиками FPC - обобщенные процедуры. А там уже будет все равно, что типов указателей на функции полдесятка. Пускай компилятор и генерирует столько кода сколько надо. У меня и сейчас таких проблем нет - см. пост выше о m4. Добавляется в компилятор знание о том, что указатели на объекты и вложенные функции - это одно и тоже, и больше не будет генерации лишнего кода.

В Дельфи есть reference тип? Ну и отлично. Теже интерфейсы только в профиль + немного синтаксического сахара. Ну реализовать отдельным типом и делов-то :)

По соотношению (навороты языка*близость к железу)/время компиляции - Паскаль и так очень выгодно выглядит на фоне остальных статически-типизованных компилируемых языков.
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Пред.След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru