Лямбда как goto
От: B0FEE664  
Дата: 21.04.16 14:07
Оценка: 17 (3) +1 :))) :))
  лирическое отступление

Еще я мальчиком все думал: заведу себе зверька,
а то их вон сколько скачет по полям-то.
Возьму в товарищи разумного жирафа, муравьеда
или просто кенгуру, я даже имя подыскал.
Лямбда! Я назову его Лямбда! —
Так думал я, но детство кончилось, а бедный муравьед
и по сегодня остается невостребован
и скачет, где скакал!



А правда, что модные программисты больше не используют олдс-кульную конструкцию вида:
do{ if (..) continue; } while(false);

а заменили её на лямбду:
#include <iostream>
#include <string>


int main(int argc, char* argv[])
{
    std::string str = "fdsa";
    int n = -1;

    [&]()
    {
        if ( str == "asdf" )
        {
            std::cout << 1 << std::endl;
            n = 1;
            return;
        }

        if ( str == "fdsa" )
        {
            std::cout << 2 << std::endl;
            n = 2;
            return;
        }

        n = 0;
        std::cout << "unknown" << std::endl;
    }();

    std::cout << "n=" << n << std::endl;

    return 0;
}

?
И каждый день — без права на ошибку...
Re: Лямбда как goto
От: se_sss  
Дата: 22.04.16 10:17
Оценка: :))) :)
Мои ощущения от лямбд примерно соответствуют описаниям ужасов goto.
Только goto локальны, а лямбды соответствуют глобальным прыжкам.
Re[2]: Лямбда как goto
От: B0FEE664  
Дата: 22.04.16 11:06
Оценка: +2
Здравствуйте, _hum_, Вы писали:

__>? или просто пример неудачный?


Ну, может пример не удачный.
Вот, например, спрашивают как из двух циклов выйти.
Автор: LeonGorbachev
Дата: 27.05.02
Ответ прост: до цикла вписать строку [&](){, в точке выхода написать return, а месте выхода закрыть открытую скобку с помощью строки }(); вот так:
    [&]()
    {
        while(1)
        {
          for(int i = 0; i < 100; i++)
          {
            if(i == 77)
            {
              std::cout << "77! go out!" << std::endl;
              return;
            }
          }
        }
    }();
И каждый день — без права на ошибку...
Re[5]: Лямбда как goto
От: pik Италия  
Дата: 22.04.16 13:24
Оценка: :)
Здравствуйте, B0FEE664, Вы писали:


BFE>Такой код сложнее читать и он потенциально менее эффективен.


брось ты, у меня тоже вокруг колеги кругом лямбду пихают, просто надо прямо сказать повыделыватся.
есть случаи когда лямда позволяет написать изящный и короткий код, но пока ни ты никто другой этих случаев тут не приводил.
Re[6]: Лямбда как goto
От: T4r4sB Россия  
Дата: 22.04.16 15:23
Оценка: :)
Здравствуйте, se_sss, Вы писали:

_>код

_>написанный МНС для проверки своих идей

Э, полегче, полегче.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[6]: Лямбда как goto
От: Lepsik Гондурас https://www.kirdyk.club/
Дата: 10.05.16 19:10
Оценка: +1
_>И вообще, когда классики описывают ужасы goto, надо ориентироваться на какой-нибудь древний код на старой версии Фортрана,
_>написанный МНС для проверки своих идей. Мне приходилось видеть такой код.


Там кстати есть вычисляемый goto который прекрасен
Re: Используют
От: Qbit86 Кипр
Дата: 21.04.16 14:25
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>А правда, что модные программисты больше не используют олдс-кульную конструкцию вида


http://rsdn.ru/forum/cpp.applied/6336533
Автор: 777777w
Дата: 05.02.16
Глаза у меня добрые, но рубашка — смирительная!
Re[2]: Используют
От: B0FEE664  
Дата: 21.04.16 15:34
Оценка:
Здравствуйте, Qbit86, Вы писали:

BFE>>А правда, что модные программисты больше не используют олдс-кульную конструкцию вида

Q>http://rsdn.ru/forum/cpp.applied/6336533
Автор: 777777w
Дата: 05.02.16

А что, у IIFE большой оверхед?
И каждый день — без права на ошибку...
Re: Лямбда как goto
От: antropolog  
Дата: 22.04.16 02:30
Оценка:
Здравствуйте, B0FEE664, Вы писали:

меня бесит неконстантность n и str в этом примере. Ну и потом, маттерн-матчить так паттерн-матчить.


#include <iostream>
#include <string>

int main(int argc, char* argv[])
{
    const std::string str = "fdsa";

    const int n = 
            str == "asdf" ? 
        [](){
            std::cout << 1 << std::endl;
            return 1;
        }()
            : str == "fdsa" ?
        [](){
            std::cout << 2 << std::endl;
            return 2;
        }()
            :
        [](){
            std::cout << "unknown" << std::endl;
            return 0;
        }()
    ;

    std::cout << "n=" << n << std::endl;

    return 0;
}


  утренняя наркомания
#include <iostream>
#include <string>

int main(int argc, char* argv[])
{
  const std::string str = "fdsa";

  const int n = 
    str == "asdf" ? 
      (( std::cout << 1 << std::endl), 1)
    : str == "fdsa" ?
      (( std::cout << 2 << std::endl), 2)
    :
      ((std::cout << "unknown" << std::endl), 0)
  ;

  std::cout << "n=" << n << std::endl;

  return 0;
}
Отредактировано 22.04.2016 2:51 antropolog . Предыдущая версия . Еще …
Отредактировано 22.04.2016 2:50 antropolog . Предыдущая версия .
Re[2]: Лямбда как goto
От: B0FEE664  
Дата: 22.04.16 09:02
Оценка:
Здравствуйте, antropolog, Вы писали:

A>меня бесит неконстантность n и str в этом примере.


Смысл как раз в том, что n — не константа. Вместо n может быть любой объект или множество объектов, переменных. Например, это может быть структура заполняемая по результатам разбора XML...
И каждый день — без права на ошибку...
Re: Лямбда как goto
От: _hum_ Беларусь  
Дата: 22.04.16 10:04
Оценка:
Здравствуйте, B0FEE664, Вы писали:



BFE>А правда, что модные программисты больше не используют олдс-кульную конструкцию вида:

BFE>
BFE>do{ if (..) continue; } while(false);
BFE>

BFE>а заменили её на лямбду:
BFE>
BFE>#include <iostream>
BFE>#include <string>


BFE>int main(int argc, char* argv[])
BFE>{
BFE>    std::string str = "fdsa";
BFE>    int n = -1;

BFE>    [&]()
BFE>    {
BFE>        if ( str == "asdf" )
BFE>        {
BFE>            std::cout << 1 << std::endl;
BFE>            n = 1;
BFE>            return;
BFE>        }

BFE>        if ( str == "fdsa" )
BFE>        {
BFE>            std::cout << 2 << std::endl;
BFE>            n = 2;
BFE>            return;
BFE>        }

BFE>        n = 0;
BFE>        std::cout << "unknown" << std::endl;
BFE>    }();

BFE>    std::cout << "n=" << n << std::endl;

BFE>    return 0;
BFE>}
BFE>

BFE>?


B0FEE664, а чем в таком исполнении это лучше обычного:

int main(int argc, char* argv[])
{
    std::string str = "fdsa";
    int n = -1;

    
    {////
        if ( str == "asdf" )
        {
            std::cout << 1 << std::endl;
            n = 1;
            
        }
        else
        if ( str == "fdsa" )
        {
            std::cout << 2 << std::endl;
            n = 2;
        }
        else
        {
            n = 0;
            std::cout << "unknown" << std::endl;
        };

    }////

    std::cout << "n=" << n << std::endl;

    return 0;
}

? или просто пример неудачный?
Re[2]: Лямбда как goto
От: _hum_ Беларусь  
Дата: 22.04.16 10:21
Оценка:
Здравствуйте, se_sss, Вы писали:

_>Мои ощущения от лямбд примерно соответствуют описаниям ужасов goto.

_>Только goto локальны, а лямбды соответствуют глобальным прыжкам.

вы что-то путаете. лямбды дабт возможность только локальных прыжков (в пределах тела лямбды), тогда как goto -куда хочешь
Re[3]: Лямбда как goto
От: se_sss  
Дата: 22.04.16 10:46
Оценка:
Здравствуйте, _hum_, Вы писали:

__>Здравствуйте, se_sss, Вы писали:


_>>Мои ощущения от лямбд примерно соответствуют описаниям ужасов goto.

_>>Только goto локальны, а лямбды соответствуют глобальным прыжкам.

__>вы что-то путаете. лямбды дабт возможность только локальных прыжков (в пределах тела лямбды), тогда как goto -куда хочешь


Не путаю. Это ощущения.
От того, что я внезапно оказываюсь в теле функции, в которой я на самом деле не нахожусь, но зато там расположено тело лямбды.
И кстати, goto — именно локален (в пределах функции). Для глобальных переходов есть setjump() longjump(). Не приходилось пользоваться
Re[4]: Лямбда как goto
От: _hum_ Беларусь  
Дата: 22.04.16 11:15
Оценка:
Здравствуйте, se_sss, Вы писали:

_>Здравствуйте, _hum_, Вы писали:


__>>Здравствуйте, se_sss, Вы писали:


_>>>Мои ощущения от лямбд примерно соответствуют описаниям ужасов goto.

_>>>Только goto локальны, а лямбды соответствуют глобальным прыжкам.

__>>вы что-то путаете. лямбды дабт возможность только локальных прыжков (в пределах тела лямбды), тогда как goto -куда хочешь


_>И кстати, goto — именно локален (в пределах функции).


хм.. действительно, по документации только в пределах функции, хотя помню, баловался с ним, и получил перескок с тела одной функции в тело другой. но это, может, глюк компилятора.
тогда да, вопрос — чем плох goto?
Re[3]: Лямбда как goto
От: _hum_ Беларусь  
Дата: 22.04.16 11:21
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, _hum_, Вы писали:


__>>? или просто пример неудачный?


BFE>Ну, может пример не удачный.

BFE>Вот, например, спрашивают как из двух циклов выйти.
Автор: LeonGorbachev
Дата: 27.05.02
Ответ прост: до цикла вписать строку [&](){, в точке выхода написать return, а месте выхода закрыть открытую скобку с помощью строки }(); вот так:

BFE>
BFE>    [&]()
BFE>    {
BFE>        while(1)
BFE>        {
BFE>          for(int i = 0; i < 100; i++)
BFE>          {
BFE>            if(i == 77)
BFE>            {
BFE>              std::cout << "77! go out!" << std::endl;
BFE>              return;
BFE>            }
BFE>          }
BFE>        }
BFE>    }();
BFE>

это тоже не совсем удачный, ибо можно

bool bFound = false;

while(!bFound)
{
        for(int i = 0; (i < 100) && (!bFound); i++)
        {
            if(i == 77)
            {
                std::cout << "77! go out!" << std::endl;
                bFound = true;
            }
        }
}
Re[4]: Лямбда как goto
От: B0FEE664  
Дата: 22.04.16 12:06
Оценка:
Здравствуйте, _hum_, Вы писали:

__>это тоже не совсем удачный, ибо можно

__>
__>bool bFound = false;

__>while(!bFound)
__>{
__>        for(int i = 0; (i < 100) && (!bFound); i++)
__>        {
__>            if(i == 77)
__>            {
__>                std::cout << "77! go out!" << std::endl;
__>                bFound = true;
__>            }
__>        }
__>}
__>

А ещё можно исключение подбросить и поймать
Такой код сложнее читать и он потенциально менее эффективен.
И каждый день — без права на ошибку...
Re[5]: Лямбда как goto
От: dr. Acula Украина  
Дата: 22.04.16 12:27
Оценка:
BFE>Такой код сложнее читать и он потенциально менее эффективен.
Решил посоревноваться в оптимизациях с компилятором?
Re[6]: Лямбда как goto
От: B0FEE664  
Дата: 22.04.16 12:33
Оценка:
Здравствуйте, dr. Acula, Вы писали:

BFE>>Такой код сложнее читать и он потенциально менее эффективен.

DA>Решил посоревноваться в оптимизациях с компилятором?

нет. В данном вопросе мне важнее удобство чтения.
И каждый день — без права на ошибку...
Re: Лямбда как goto
От: T4r4sB Россия  
Дата: 22.04.16 12:36
Оценка:
Здравствуйте, B0FEE664, Вы писали:


BFE>А правда, что модные программисты больше не используют олдс-кульную конструкцию вида:

BFE>а заменили её на лямбду:

Да, правда. Только я ещё и имя этой лямбде даю.
А олдскульная конструкция это бред, готофобия ради готофобии.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[5]: Лямбда как goto
От: _hum_ Беларусь  
Дата: 22.04.16 12:43
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, _hum_, Вы писали:


__>>это тоже не совсем удачный, ибо можно

__>>
__>>bool bFound = false;

__>>while(!bFound)
__>>{
__>>        for(int i = 0; (i < 100) && (!bFound); i++)
__>>        {
__>>            if(i == 77)
__>>            {
__>>                std::cout << "77! go out!" << std::endl;
__>>                bFound = true;
__>>            }
__>>        }
__>>}
__>>

BFE>А ещё можно исключение подбросить и поймать
BFE>Такой код сложнее читать и он потенциально менее эффективен.

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


upd. кстати, в качестве принципиального отличия выхода по флагу от выхода по прыжку можно рассматривать отсутствие у первого гарантии того, что если в каком-то месте стоит код bFound = true, то цикл будет прерван (в отличие от return, break)
Отредактировано 22.04.2016 12:54 _hum_ . Предыдущая версия .
Re[7]: Лямбда как goto
От: pik Италия  
Дата: 22.04.16 13:28
Оценка:
Здравствуйте, B0FEE664, Вы писали:


BFE>нет. В данном вопросе мне важнее удобство чтения.


так нету его особого удобства то, спор на пустом месте, прямая логика всёещё быстрее читается.
возможно через год два три четыре пять появятся программисты которые без лямды код вообще не понимают,
но я лично считаю с этим надо боротся и без необходимости её не применять. по крайней мере я режу успешо
во всех ревьюв бесполезные лямбды
Re[2]: Лямбда как goto
От: pik Италия  
Дата: 22.04.16 13:33
Оценка:
Здравствуйте, T4r4sB, Вы писали:


TB>Да, правда. Только я ещё и имя этой лямбде даю.

TB>А олдскульная конструкция это бред, готофобия ради готофобии.

этой лямбде имя ну совсем ненужно, оно исполяется сразу на месте и больше нигде
Re[5]: Лямбда как goto
От: se_sss  
Дата: 22.04.16 14:11
Оценка:
__>тогда да, вопрос — чем плох goto?
Да я ничего плохого про него и не говоря. (Даже один раз в этом году закоммитил код с goto .)
Я просто сравниваю ощущения от лямбд с тем, какие ужасы пишут про goto.
Лямбды, конечно, удобны, иногда даже изящны, но свою долю сложности привносят.
Привносят уже потому, что позволяют легче писать сложные конструкции.

И вообще, когда классики описывают ужасы goto, надо ориентироваться на какой-нибудь древний код на старой версии Фортрана,
написанный МНС для проверки своих идей. Мне приходилось видеть такой код.
Вот там да, goto considered harmful во всей красе.
Re[8]: Лямбда как goto
От: B0FEE664  
Дата: 22.04.16 15:27
Оценка:
Здравствуйте, pik, Вы писали:

BFE>>нет. В данном вопросе мне важнее удобство чтения.

pik>так нету его особого удобства то, спор на пустом месте, прямая логика всёещё быстрее читается.

Ничего не легче: или лес if-else'ов, или флаги с ненужными проверками.

pik>возможно через год два три четыре пять появятся программисты которые без лямды код вообще не понимают,

Уже скоро в ходу будут мапы на вариадиках из лямбд и уж тогда вам будет не отвертеться!

pik>но я лично считаю с этим надо боротся и без необходимости её не применять. по крайней мере я режу успешо

pik>во всех ревьюв бесполезные лямбды
А вот раньше так с шаблонами боролись...
И каждый день — без права на ошибку...
Re[7]: Лямбда как goto
От: se_sss  
Дата: 22.04.16 20:20
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Здравствуйте, se_sss, Вы писали:


_>>код

_>>написанный МНС для проверки своих идей

TB>Э, полегче, полегче.


Да ладно, не на что тут обижаться им.
Re[8]: Лямбда как goto
От: T4r4sB Россия  
Дата: 22.04.16 20:46
Оценка:
Здравствуйте, se_sss, Вы писали:

_>Здравствуйте, T4r4sB, Вы писали:


TB>>Здравствуйте, se_sss, Вы писали:


_>>>код

_>>>написанный МНС для проверки своих идей

TB>>Э, полегче, полегче.


_>Да ладно, не на что тут обижаться им.


Кому "им"? Я МНС, и чо? За современными тенденциями, по крайней мере, в крестах, слежу, готами лапшу не делаю, хотя для выхода из вложенного цикла считаю их допустимыми.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[9]: Лямбда как goto
От: se_sss  
Дата: 23.04.16 13:20
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Здравствуйте, se_sss, Вы писали:


_>>Здравствуйте, T4r4sB, Вы писали:


TB>>>Здравствуйте, se_sss, Вы писали:


_>>>>код

_>>>>написанный МНС для проверки своих идей

TB>>>Э, полегче, полегче.


_>>Да ладно, не на что тут обижаться им.


TB>Кому "им"? Я МНС, и чо? За современными тенденциями, по крайней мере, в крестах, слежу, готами лапшу не делаю, хотя для выхода из вложенного цикла считаю их допустимыми.


Рад за вас.
Я тоже считаю допустимым.
Однако от человека, для которого программирование — не основной инструмент, а которому надо просто что-то подсчитать, ждать красот кода не стоит.
Как я понимаю, в момент, когда писалась та знаменитая статья про goto, средний по качеству код им просто кишел (хотя бы просто потому, что сам язык (как FORTRAN c оператором if на метках) хорошей альтернативы не предлагал.
Re[9]: Лямбда как goto
От: Erop Россия  
Дата: 11.05.16 06:03
Оценка:
Здравствуйте, B0FEE664, Вы писали:

pik>>во всех ревьюв бесполезные лямбды

BFE>А вот раньше так с шаблонами боролись...

И сейчас борются...
Зачем бы оставлять в коде бесполезные шаблоны?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.