avva: (Default)
[personal profile] avva
(эта запись может быть интересна только программистам)

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

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

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

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

Date: 2016-05-01 12:19 am (UTC)
From: [identity profile] rezkiy.livejournal.com
а вам разве кодинг стандарт позволяет?

Date: 2016-05-01 12:28 am (UTC)
From: [identity profile] avva.livejournal.com
теперь позволяет. Но вообще не стоит ими злоупотреблять, по-моему.

P.S. Я написал пустое утверждение. Ничем не стоит злоупотреблять. Попытка придать ему значение: мне кажется, что не стоит создавать API, при использовании которых всегда напрашивается использование лямбд. Скажем, если я вызываю foo() и передаю ей callback, при вызове которого, чтобы сделать осмысленную работу, мне наверняка понадобятся локальные переменные, с помощью которых я соорудил вызов foo().
Edited Date: 2016-05-01 12:33 am (UTC)

Date: 2016-05-01 02:01 am (UTC)
From: [identity profile] solomon2.livejournal.com
Т.е. filter и map (à la Python) отпадают?

Date: 2016-05-01 04:02 am (UTC)
From: [identity profile] nokachi.livejournal.com
У лямбды к тому же неизвестный программисту тип, так что тут без шаблонов и auto не обойтись, наверно.

Date: 2016-05-01 04:39 pm (UTC)
From: [identity profile] ulfurinn.livejournal.com
Они замечательно превращаются в std::function.

Date: 2016-05-02 10:19 am (UTC)
From: [identity profile] mtyukanov.livejournal.com
Это еще более странное утверждение.

Лямбды -- упрощенный синтаксис для создания анонимных функторов. Не стоит создавать API, принимающие функторы? А что вместо них? Сишные коллбэки в виде указателей на функцию и передачей замыканий через дополнительные аргументы? Это удобно только для интерфейса с ассемблером и си, имеет смысл в драйверах и т.п. В общем программировании удобнее принимать аргументом любой callable object, будь то функтор, лямбда, результат std::bind или std::function.

Или имеется в виду -- не надо заставлять захватывать переменные без нужды? Это да, конечно. При полном отсутствии захвата переменных легко использовать указатели на функцию, а функторы и лямбды становятся значительно более эффективными -- ведь захват -- это вызов конструктора.

Я бы сказал, что появление лямбд увеличивает полезность кода, написанного с использованием callable objects. До C++11 всяческие for_each, find_if и т.п. использовались крайне редко, потому что тривиальный цикл написать проще, чем тривиальный функтор. Функторы писали только для особо сложных или особо частых использований, и то обычно лень было. Лямбды просты, и этим стали пользоваться.

Date: 2016-05-01 12:36 am (UTC)
From: [identity profile] spamsink.livejournal.com
Мужики знали, но это была чисто gcc-шная фича, поэтому в реальной жизни плохо применимая.

Date: 2016-05-06 09:55 am (UTC)
From: [identity profile] ticklish-frog.livejournal.com
К сожалению, эта фича в реальной жизни привела к тому, что у нас, независимо от того, используем или нет эти вложенные функции, исполняемый стек. Причина в том, что эти функции хранятся в стеке, и должны быть вызываемыми, стек надо сделать исполняемым, если есть такие функции в исходном коде. Системы opt-in, чтобы компилятор аннотировал модули, для которых стек должен быть исполняемым, придумано поначалу не было, поэтому пришлось разрешить исполнение по умолчанию, и ввели аннотации по принципу opt-out. Потом, конечно, ввели и opt-in аннотации. Но до сих пор встречаются модули без аннотаций, которе, если попадают в результат при сборке, заставляют делать стек исполняемым, поскольку неясно, есть ли такие функции в модуле.

Вот тут подробно написано: http://www.airs.com/blog/archives/518

Date: 2016-05-01 01:42 am (UTC)
From: (Anonymous)
Ну ведь нельзя же так. Я пока читал чуть не испугался. Хотя это иллюстрирует что я ламер в gcc, не слежу за событиями.

Date: 2016-05-01 02:13 am (UTC)
From: [identity profile] amigofriend.livejournal.com
Надеюсь, скачет теперь востребованной.

Date: 2016-05-01 05:49 am (UTC)
From: [identity profile] niobium0.livejournal.com
too little too late.

Date: 2016-05-01 06:01 am (UTC)
From: [identity profile] rustler2000.livejournal.com

Так ведь struct _ { static int sum (....  все время работает

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

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

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

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

Date: 2016-05-01 11:25 am (UTC)
From: [identity profile] vmozgutuman.livejournal.com
Насколько я понимаю в этих делах, замыкания в языках без сборщика мусора если и возможны, то бессмыслены.

Потому что замыкание, поинтер на который вы должны везде за собой таскать, ничем от обычного объекта не отличается.

Date: 2016-05-01 02:58 pm (UTC)
From: [identity profile] mounwell.livejournal.com
Анатолий, вам довелось писать на Go? Как впечатления?

Date: 2016-05-02 05:29 pm (UTC)
From: [identity profile] selfmade.livejournal.com
Следующий пост в моей ленте - http://nponeccop.livejournal.com/484286.html

June 2025

S M T W T F S
123 4 5 6 7
8 910 11 12 13 14
15 16 17 18192021
22232425262728
2930     

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 18th, 2025 01:22 pm
Powered by Dreamwidth Studios