Кресты / Говнокод #12130 Ссылка на оригинал

0

  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 suc-daniil, (Updated )

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

    • Просто спать надо больше, тут даже 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 ведь и вправду не нужен:
            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;
    Ответить
      • Мне интересно, кто это минуснул? Тот кто не знает стандарт С++ или тот кто не знает стандарт и не хочет знать?
        Ответить
    • Тем что 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 и аргументы командной строки вполне читаются 😉
                        Ответить
                        • Наверное, они имели в виду нечто совсем иное.
                          Ответить
      • > Чего стоит только 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.
              Ответить
              • Все? Зачем? Оптимизатора кода там нет, не могу понять технических причин так делать.
                Ответить
                • А походу весь фор вместе со скобками это одна команда. Он собирает ее, как обычно проставляет %переменные%, и только потом начинает исполнение.

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

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

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8