1. C++ / Говнокод #12130

    +18

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    using namespace boost;
    typedef filesystem::recursive_directory_iterator dir_iter_t;
    dir_iter_t itt(filesystem::current_path());
    while ([&](dir_iter_t &itter) -> decltype(itter)
    {
        std::cout << boost::filesystem::path((*itter++).path()).make_preferred().string() << std::endl;
        return itter;
    }(itt) != dir_iter_t());

    Вчера ночью написал сие чудо , сегодня когда увидел - меня чуть приступ не хватил.
    Выводит в консоль всё содержимое текущего каталога и всех вложенных.

    Запостил: suc-daniil, 15 Ноября 2012

    Комментарии (46) RSS

    • Иттератор.
      Так там же скобки не хва... OH SHI-
      Ответить
    • лямбда головного мозга
      в этом и плох новый стандарт
      Ответить
      • Просто спать надо больше, тут даже itter уже намекает (слово iterator с одной t).
        Сейчас то я прекрасно осознаю, что помещать в условие while что-то более-менее сложное - говно.
        Ответить
        • while ненужно
          namespace fs = boost::filesystem;
          
          for (fs::recursive_directory_iterator rit(fs::current_path());
                  rit != fs::recursive_directory_iterator();
                  ++rit)
          {
              std::cout << rit->path() << std::endl;
          }
          вот кстати не нравится говнецо в бустовом файлсистеме, где для проверки итератора не заведено operator bool (), а надо сравнивать с пустым итератором с длинным именем
          Ответить
          • for не нужен
            Ответить
            • А почему зелёным? for ведь и вправду не нужен:
              namespace fs = boost::filesystem;
              
              fs::recursive_directory_iterator rit(fs::current_path());
              while (rit != fs::recursive_directory_iterator()) 
              {
                  ++rit;
                  std::cout << rit->path() << std::endl;
              }
              Так ведь легче читается.
              Ответить
              • while (rit++ != fs::recursive_directory_iterator()) 
                    std::cout << rit->path() << std::endl;
                Интересно, за такое уже повергнут остракизму?
                А, нет, стойте! А самое первое значение чего?
                Ответить
      • Лямбды это хорошо, но только если использовать по предназначению, а то по читабельности хуже хардкорного хаскеля получается.
        С++ с каждым новым стандартом расширяет список возможных диагнозов.
        Ответить
        • > С++ с каждым новым стандартом расширяет список возможных диагнозов.

          ^^
          Ответить
          • Какой хитрый Тарас! Процитировал фразу и все плюсы ушли ему, а не автору!
            Ответить
            • Всё, я себя проминусовал, чтобы честнее было.
              Ответить
        • > по читабельности хуже хардкорного хаскеля получается.

          C++ всегда читался хуже хаскелла.
          Ответить
    • Это что-за говнокод? Так нужно говнокодить:
      using namespace boost;
      typedef filesystem::recursive_directory_iterator dir_iter_t;
      dir_iter_t itt(filesystem::current_path());
      while ([&](dir_iter_t &itter) -> auto
      {
          return std::cout << boost::filesystem::path((*itter++).path()).make_preferred().string() << std::endl, itter;
      }(itt) != dir_iter_t());
      Ответить
    • for(auto rit : boost::make_iterator_range(fs::recursive_directory_iterator(fs::current_path()), fs::recursive_directory_iterator()))
        std::cout << rit->path() << std::endl;
      Ответить
      • rit.path()
        Очевиднофикс
        Ответить
        • Мне интересно, кто это минуснул? Тот кто не знает стандарт С++ или тот кто не знает стандарт и не хочет знать?
          Ответить
    • Автор, а чем вам для такой задачи batch-скрипты не угодили?
      Ответить
      • Тем что BAT скрипты (как и вся виндовая консоль) сраное ёбаное говнище доисторического мамонта, написаное укуренными в хлам индусами-гомосексуалистами. Хотя green тут не к месту, ибо это истинная правда. Чего стоит только setlocal enabledelayedexpansion, без которого переменную в цикле не поюзать. Или всякие %date:~0,3% для строковых операций... Или for и set, которые выполняют чуть менее, чем 90% всех операций, доступных в этом языке.

        Так, а теперь по делу. Походу автор выводил названия просто для отладки, а потом эта программа будет делать что-то умное типа отправки файлов по сети, подсчета CRC и т.п.

        P.S. Повершелл такое же говно. Из вменяемых языков под виндой из коробки только JScript через WSH.
        Ответить
        • Ну не скажи. Что-то серьёзное на батниках не напишешь конечно, но простенькие задачки они вполне могут решить. Приведу свой пример. Мне нужно было с помощью консольной утилиты перекодировать >4000 .wav треков из одного каталога и перемещать уже перекодированные в другой. Расчехлять IDE было лень. поэтому решил всё это дело на .bat организовать. Пропыхтел я над скриптом минут 40, но результат меня вполне удовлетворил. В другой раз попробую WMI.
          Ответить
          • > Пропыхтел я над скриптом минут 40
            Ну собственно лишнее доказательство того, что батники говно. Вот всяко минут 35 из них ушло на ёблю с синтаксисом for'а и 5 на полезную работу.

            Тот же баш хоть и тоже довольно укурен, но на нем такое пишется в районе 5-10 минут, а может и быстрее.
            Ответить
            • > 35 из них ушло на ёблю с синтаксисом
              Тут ты прав. Пока не узнал про setlocal enabledelayedexpansion никак не мог понять, почему переменные в цикле работают неправильно.
              Ответить
              • Ви просто не умеете их гойтовить
                Следует юзать не структурированные if и for, а подпрограммы
                Ответить
                • Юзать подпрограммы и goto вместо циклов? Нет уж, я лучше setlocal enabledelayedexpansion объявлю.
                  Ответить
                • > Следует юзать не структурированные if и for, а подпрограммы
                  Костыль на костыле и костылем погоняет. Впизду такие удобства.
                  Ответить
                • Рекурсивные функции вместо циклов? Оу, как в небыдлоязыках?
                  Ответить
              • Ну собственно до того момента, как я столкнулся с этой "фичей" фора, мне нравились батники... Теперь же к ним осталась только ненависть.

                P.S. Да и как бы дома линукс, на работе, в основном, линукс... уже как-то привык к башу, пёрлу и питону. А после них батники, сам понимаешь, неюзабельны.

                P.P.S. А под виндой посмотри все-таки в сторону JScript. Язык вменяемый, если на JavaScript кодил - то вообще учить ничего не придется, только гуглить нужные для задачи объекты и методы. Управление планировщиком задач, чтение\запись текстовых файлов, запуск внешних команд, отправка емейлов там элементарно делаются...
                Ответить
                • Можно и на VBScript, с ним может справиться даже школьник, который видел в школе бейсик.
                  Ответить
                  • > Можно и на VBScript
                    Древние бейсики мне нравились. А с vbs у меня плохие отношения, ну не люблю я не нам писать, на js как-то приятней.

                    Ну а так да. Любой язык, поддерживаемый WSH имеет одинаковые возможности.
                    Ответить
                    • > ну не люблю я не нам писать, на js как-то приятней
                      Та же хрень. Он выглядит более вымученным. Но для школьников - самое то.
                      > имеет одинаковые возможности
                      Не совсем. Сейчас я точно врать не буду, но в JScript какой-то фичи не было. Озабоченные быдлокодеры делали связку с бейсиком.
                      Правда, это была фича толи языка, толи библиотеки.
                      Ответить
                      • Посмотрел по записям. Судя по всему, там нет реализации окошек сообщений и полей ввода. Вот что пишут в инете: "JScript doesn't support the VBScript InputBox function, and WSH doesn't provide a method for user input."

                        Поэтому упоротые делают так:
                        var vbe = new ActiveXObject('ScriptControl');
                            vbe.Language = 'VBScript';
                            return vbe.eval(func + '(' + args.join(', ') + ')');
                        Ответить
                        • > and WSH doesn't provide a method for user input
                          stdin и аргументы командной строки вполне читаются ;)
                          Ответить
                          • Наверное, они имели в виду нечто совсем иное.
                            Ответить
        • > BAT скрипты
          WUT scripts
          Ответить
        • > Чего стоит только setlocal enabledelayedexpansion, без которого переменную в цикле не поюзать.

          В смысле, не поюзать даже для чтения?
          Ответить
          • Для чтения юзаются, но в пределах цикла они иммутабельны ;) Вернее интерпретатор проставляет их значения перед выполнением цикла.
            Ответить
            • Все переменные? Или только управляющие переменные цикла?

              Если второе, то правильно.
              И в Дельфи и Аде они внутри иммутабельны тоже.
              А потому, что нехуй.
              Когда я вижу заголовок цикла "для и от а до бэ", то я сразу понимаю, что цикл выполнится для и от а до бэ (ну возможно, вылетит раньше) и я не предполагаю, что внутрь воткнут "и присвоить а", что сделает цикл хитрожопой хренью с возвратами. И если я вижу в коде внутри вот это вот "и присвоить а", которые пропускают только древнющие как говно мамонта компиляторы, ну и совместимые с ними, то я испытываю БОРЛАНД
              Ответить
              • Все переменные.
                set counter=1
                for ... (
                    set /a counter=%counter%+1
                )
                echo %counter%
                Вот этот код выведет 2 (если я нигде не ошибся в синтаксисе). Т.к. %counter% проставляется 1 раз в начале цикла. А правильный вариант будет таким:
                set counter=1
                for ... (
                    set /a counter=!counter!+1
                )
                echo %counter%
                Но !переменные! не пашут если не включить setlocal enabledelayedexpansion.
                Ответить
                • Все? Зачем? Оптимизатора кода там нет, не могу понять технических причин так делать.
                  Ответить
                  • А походу весь фор вместе со скобками это одна команда. Он собирает ее, как обычно проставляет %переменные%, и только потом начинает исполнение.

                    > не могу понять технических причин так делать
                    Там выше зеленым они описаны.
                    Ответить

    Добавить комментарий