1 Востаннє редагувалося LoganRoss (12.05.2017 21:38:03)

Тема: Lambda-вирази

Свого часу при вивченні Lambda-виразів в мене виникало багато питань, а в інтернеті все було описано досить поверхово і складно. Можливо зараз є більш детальні ресурси, однак я вирішив написати свою статтю про Lambda-вирази. Сподіваюся, комусь вона допоможе і буде читатися без зусиль. Статтю прикріплюю в форматі pdf.

Lambda-expression.pdf (скачати)

Можливо, пізніше писатиму ще якість статті і добавлятиму сюди.

P.S. Якщо є якась критика або зауваження до матеріалу - пишіть.
P.P.S. Обновив статтю, враховуючи ваші зауваження.

P.P.P.S. Виклав в HTML форматі [1], [2]

Подякували: P.Y.1

2

Re: Lambda-вирази

По-перше, все ж лямбда-вирази. Бо це лямбда - це грецька літера λ. Оскільки на англійських клавіатурах немає такого символу, вони пишуть її назву латинкою - lambda. Жодного сенсу для нас писати назву грецької літери латинкою немає.
Далі - додайте один абзац про те, що таке лямбди в математиці. На кшталт отакого - тільки в останньому рівнянні мала бути λ, а не x, звідти воно і походить.
Далі у вас іде суцільний ад із визначень:

функтор – це скорочена назва від «функціональний об’єкт». Функціональний об’єкт (надалі функтор)...


Lambda-вираз – це скорочена форма запису анонімних функторів. Іншими словами –
це безіменна локальна функції.

Отже, лямбда-вираз - це скорочена форма запису анонімних функціональних об'єктів.
Гм... а до чого тут анонімність/безіменність? Якщо ми напишемо
Functor *x=new Functor();
то об'єкт же буде анонімним, правда? Ім'я є тільки у посилання на нього, у нього немає?
Справа в тому, що ви ані слова не сказали про посилання на функції. Особливо зазначати анонімність має сенс тільки в такому випадку:

void output(int value)
{
    cout<<value<<" ";
}
for_each(myVector.begin(),myVector.end(),output); //у функцію передається посилання на функцію з ім'ям
for_each(myVector.begin(),myVector.end(),[](int value){cout<<value<<" ";}); //у функцію передається посилання на анонімну функцію

Тепер трохи зрозуміліше, чому воно анонімне, правда? Ну а наступний крок (точніше, коли доходить до захоплення змінних) - анонімні класи функторів, і, відповідно, самі функтори.

Ну і тупо помилки:
Бюрократизм із "надалі" потрібен, якщо ми вводимо своє позначення для складного виразу в формальних документах; але у вас першим зустрічається саме "функтор", тобто цей "надалі" нічого не додає до тексту, отже, "надалі" тут не потрібен і тільки плутає читача. В гіршому разі можна написати "надалі вживатимемо назву "функтор", але ще раз кажу: ви щойно сказали, що "функтор" - синонім "функціонального об'єкту".

Клас Functor оголошений перевантажений operator().

У класі

Lambda-вираз – це скорочена форма запису анонімних функторів. Іншими словами –
це безіменна локальна функції.

функція

В загальному Lambda-вираз має таку структуру: [](){};
Тобто, дану вище структуру можна записати так: []()->void{};
Згідний, такий синтаксис дещо дивний для мови С++.

Тут логіка подання шкутильгає. Може, перепишете це якось так: "щоб явно зазначити тип, який повертає лямбда, можна скористатися стрілочним записом []()->тип{}"? Ну і про "дивний синтаксис", як на мене, некоректно - він уведений разом із лямбдами (і задля них) у C++11, а отже, не може бути дивним, якщо є в стандарті.

Подякували: LoganRoss, Yola2

3

Re: Lambda-вирази

І я б робив відступи для {} на рівні проголошення лямбди, а не першого символу в рядку:

for_each(myVector.begin(),myVector.end(),[](int value)
                                         {
                                             cout<<value<<" ";
                                         });

а ще краще - першу фігурну дужку лишати у тому ж рядку, і закривати круглу дужку навпроти її пари:

for_each(myVector.begin(),myVector.end(),[](int value){
                                                          cout<<value<<" ";
                                                      }
        );
Подякували: LoganRoss1

4

Re: Lambda-вирази

Чому б не викласти десь у HTML форматі. Наприклад тут https://codeguida.com/

Подякували: LoganRoss, koala2

5 Востаннє редагувалося LoganRoss (12.05.2017 21:38:23)

Re: Lambda-вирази

Дякую за зауваження. Відредагував і доповнив - Lambda-expression.pdf (скачати)
Форматування коду не виправив, оскільки не зберіг всі приклади з кодом, а переписувати трохи не вистачає часу, але на вихідних постараюся зробити код максимально читабельним.

Yola написав:

Чому б не викласти десь у HTML форматі. Наприклад тут https://codeguida.com/

Не знав що є такий україномовний сервіс. Дякую, пізніше викладу.

Та і це моя перша стаття, тому виношу її в "народ" трохи з острахом.

P.S. Виклав в HTML форматі [1], [2]

Подякували: ReAl, Yola2