avva: (Default)
avva ([personal profile] avva) wrote2016-05-01 02:47 am

программистское, замыкания

(эта запись может быть интересна только программистам)

Оказывается, в gcc уже черт знает сколько лет существуют замыкания в виде вложенных функций. Настоящие замыкания! Но только в C, в C++ они не работают (в C++ теперь есть лямбды, но это ж недавно).

А мужики-то и не знали! Если серьезно, я поражен.

Update. Карнавал отменяется. Это не настоящие замыкания, они не сохраняют жизнь пойманным локальным переменным при выходе из функции. Ну, так неинтересно. Как-то даже обидно стало. Пустышка.

Ладно, будем лямбды значит внедрять в народное хозяйство. Кстати, пару недель назад впервые написал настоящую лямбду в рабочем коде на C++.

[identity profile] link0ff.livejournal.com 2016-05-01 11:01 am (UTC)(link)
Интересный эффект: "If you try to call the nested function through its address after the containing function exits, all hell breaks loose."

[identity profile] avva.livejournal.com 2016-05-01 11:14 am (UTC)(link)
Это то что я имел в виду под "они не сохраняют жизнь пойманным локальным переменным при выходе из функции".

Более серьезная имплементация делала бы одно из двух:
- копировала переменные, использованные во вложенной функции, для ее использования (так в лямбдах C++11)
- создавала именно эти переменные не на стэке, а в куче, и давала им жить после выхода из функции (это формально говоря не нарушает стандарт, я думаю, но реально слишком сильно нарушает сложившиеся конвенции, чтобы всерьез рассматривать эту возможность)

[identity profile] certus.livejournal.com 2016-05-02 12:46 pm (UTC)(link)
Языковое замечание: в русском языке слово «конвенция» означает исключительно «межгосударственное соглашение». На мой взгляд, в используемом контексте английское convention следует переводить как «традиция», «порядок вещей».