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

    +2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1371r1.pdf#section.4
    // Pattern Matching P1371R1
    
    // before
    
    auto&& [x, y] = p;
    if (x == 0 && y == 0) {
      std::cout << "on origin";
    } else if (x == 0) {
      std::cout << "on y-axis";
    } else if (y == 0) {
      std::cout << "on x-axis";
    } else {
      std::cout << x << ',' << y;
    }
    
    // after
    
    inspect (p) {
      [0, 0]: std::cout << "on origin";
      [0, y]: std::cout << "on y-axis";
      [x, 0]: std::cout << "on x-axis";
      [x, y]: std::cout << x << ',' << y;
    }

    Говностандартизаторы очередную хуйню изобретают. Нет чтоб нормальную гомоиконность сделать, чтоб через нее любую такую поебень синтезировать можно было, не изменяя говностандарт, не добавляя всяких новых statement. И почему они не хотят эту херню прикрутить тупо к switch? Что если у меня переменная называется inspect, мне ее что, переименовывать?

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

    Запостил: j123123, 10 Января 2020

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

    • Какой switch-case )))
      Ответить
    • О, паттерн-матчинг завезли! Полезная штука, жаль только, что, как всегда, получилось перегруженное, вербозное и костыльное говно.
      Кстати, в 4.6 что-то знакомое:
      struct Expr;
      struct Neg {
          std::shared_ptr<Expr> expr;
      };
      struct Add {
          std::shared_ptr<Expr> lhs, rhs;
      };
      struct Mul {
          std::shared_ptr<Expr> lhs, rhs;
      };
      struct Expr : std::variant<int, Neg, Add, Mul> {
          using variant::variant;
      };
      namespace std {
          template <>
          struct variant_size<Expr> : variant_size<Expr::variant> {};
          template <std::size_t I>
          struct variant_alternative<I, Expr> : variant_alternative<I, Expr::variant> {};
      }

      Какой калькулятор )))

      int eval(const Expr& expr) {
          return inspect (expr) {
              <int> i => i,
              <Neg> [*? e] => -eval(e),
              <Add> [*? l, *? r] => eval(l) + eval(r),
              // Optimize multiplication by 0.
              <Mul> [*? (<int> 0), __] => 0,
              <Mul> [__, *? (<int> 0)] => 0,
              <Mul> [*? l, *? r] => eval(l) * eval(r)
          };
      }

      Ой, пиздец. Почему бы не насыпать ещё больше спецсимволов, а?
      int eval(const Expr& expr) {
          return inspect (expr) {
              <[^{^int$}$]> i *&#@=^%> i,
              <[^{^Neg$}$]> [*? e] *&#@=^%> -eval(e),
              <[^{^Add$}$]> [*? l, *? r] *&#@=^%> eval(l) + eval(r),
              // Optimize multiplication by 0.
              <[^{^Mul$}$]> [*$#%^&@##(?) (<[^{^int$}$]> 0), ^__^] *&#@=^%> 0,
              <[^{^Mul$}$]> [^__^, *$#%^&@##(?) (<[^{^int$}$]> 0)] *&#@=^%> 0,
              <[^{^Mul$}$]> [*$#%^&@##(?) l, *$#%^&@##(?) r] &#@=^%> eval(l) * eval(r)
          };
      }

      Во-о-от, теперь — заебись! Именно так, по мнению этих говностандартизаторов, и должен выглядеть код на «Modern C++».
      Ответить
      • Оператора «Сатурн» не хватает.
        Ответить
        • Оператора goatse, как в перле.
          Ответить
        • Оператор сатурн нужен только там, где есть перегрузка по возвращаемому значению.
          Именно её и не хватает в С++.
          Хотя при наличии операторов для каста ее легко реализовать
          Ответить
      • Предлагаю встроить в компилятор язык правил из Sendmail
        Ответить
        • А я предлагаю встроить констукции из языка «Парсер».
          $n(2*2) — присвоить переменной n результат выражения 2*2, т. е. 4.
          $s[2*2] — присвоить переменной s строку "2*2".
          $x{$s} — выполнить код в фигурных скобках и присвоить результат переменной x.

          Красиво?

          https://www.parser.ru/docs/lang/?vars.htm
          Ответить
          • следующая конструкция сообщает, что код в $s написан на php версии 50 (послал теме фичареквест)
            $x{$s:lphpv50}
            Ответить
        • А я ещё вспомнил языки конфигурации «nginx» и «lighttpd». Там есть паттерн-матчинг URL с регулярками. Правда, там всё легко читается.
          Ответить
          • Несложные регулярки нормально читаются, когда ты впринципе знаешь регулярки.

            Помнишь mod_rewrite в apache, кстати?:)
            Ответить
            • Там красиво. Но без документации я ничего не вспомню.
              Ответить
              • это дедушка всех этих реврайтов
                https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriterule
                Ответить
      • int eval(const Expr& expr) {
            return inspect (expr) {
                <int> i => i,
                <Neg> [*? e] => -eval(e),


        Я запутался. Уже и ТАКОЕ в крестах компилируется?

        Впрочем в С# завезли. В Скале было. В Жабу скоро завезут.
        Чем C++ хуже?
        Ответить
        • Это относительно новый пропозал. Скоро будет компилироваться.
          Ответить
          • Ага. Я уже глянул pdf-ник.

            Ну типичный С++ way. Взяли нормальную идею и дико всё усложнили.
            Ответить
        • >[*? e]
          а как это читается?
          Ответить
          • 5.3.2.6  Dereference Pattern
            The dereference pattern has the following forms:
            * ! pattern
            * ? pattern
            
            The first form matches value v if pattern matches *v. 
            The second form matches value v if v is contextually convertible to bool and evaluates to true, and pattern matches *v
            Ответить
            • Может быть, проще уже сделать компилятор «Перла» в нативный код, чем дорабатывать кресты?
              Ответить
              • Нет. С++ нужно ещё больше доработок.

                Поскольку он пока ещё сохраняет остатки читабельности.
                Ответить
              • Шестой перл конпилится в байткод. У него кстати много реализации, может быть и в нативный код можно сконпелировать.
                Ответить
          • Left bracket, star, question mark, "e", right bracket.
            Ответить
      • >Именно так, по мнению этих говностандартизаторов, и должен выглядеть код на «Modern C++».

        Они готовят С++ к мерджу в Perl 6
        Ответить
    • > Что если у меня переменная называется inspect, мне ее что, переименовывать?
      Вот кстати да. Ладно там «constexpr» заняли — такого идентификатора реальный пример вряд ли можно привести. Но блядь, «inspect» в любом крупном проекте есть! Они там совсем ёбнулись, чи шо, я не пойму?..
      Ответить
      • именно по этому я за "сигил"
        Ответить
      • Так из контекста парсер будет понимать, не?
        Ответить
        • лексеру не сладко будет
          Ответить
          • Именно поэтому я за «Алгол». В «Алкоголе-68» ключевые слова можно было выделять апострофами или точками, когда есть риск спутать их с пельменными:
            https://en.wikipedia.org/wiki/ALGOL_68#Example_of_different_program_representations
            Ответить
            • А я за "PHP", "Perl", "bash", "Tcl". В общем я за "$".
              Ответить
              • Но в них же идентификаторы функций не выделяются на фоне ключевых слов. Там только переменные выделили. А в «Алголе» можно было выделять и имена переменных, и имена функций.
                Ответить
                • Вот это нехорошо. С ФВП возникает какая-то питушня, когда есть такая разница. С пониманием функции как питуха первого класса вознивает какая-то питушня.
                  Ответить
                • В перле вроде & можно. В Tcl зарезервированных слов нет, можно переопределить хоть if, хоть set, хоть proc (даже # можно (комментарий) но напрямую вызвать не получится).9
                  Ответить
          • Лексер не нужен.
            Ответить
          • ... раздался пронзительный голос со стороны параши.

            Но комитет, как всегда, не обратил внимания на это визгливое кукареканье. Пусть кукарекает, что с него взять?

            Компилятор — не человек, и сегодня ему предстоит очень трудная сборка. У него уже в течение полутора лет каждая сборка была очень трудной, и теперь его лексер был разработан настолько, что одно и то же выражение могло обозначать что угодно, в зависимости от контекста.
            Ответить
          • А ему-то что? Собрал символы в identifier и сунул в ASL.
            Это парсеру потом надо пердолиться с вореантами и тормозить из-за этого.
            Ответить
            • Действительно непричем

              Символ и символ.

              Лексер понятию "контекст" не обучен, ибо конченный автомат.
              А вот парсер должен контекстно-зависимые штуки понимать
              Да?
              Ответить
              • А как тогда в жопоскриптах отличить рагулярку от деления, не зная контекста?
                Ответить
                • >тогда в жопоскриптах отличить рагулярку от деления, не зная контекста?

                  Ситуация осложняется тем, что в js не так давно завезли новые алгебраические операторы.

                  >> 2 ** 3
                  8
                  
                  >> 8 // 1
                  8
                  Ответить
                  • Пи, скоро весенний призыв, пи.
                    Ответить
                  • > 8 // 1

                    Это вообще багор
                    Ответить
                    • Код с однострочными комментариями распидорасит?
                      Ответить
                      • Нет, просто во втором случае, я зелёный цвет забыл поставить.
                        Ответить
                        • Самое страшное, что авторы современных ЯП нагенерировали столько фигни, что даже первоапрельские шутки воспринимаются всерьёз.
                          Ответить
                          • Кстати правильно подмечено. Весенний призыв 1 апреля.
                            Ответить
                        • Я тоже повёлся, полез проверять, а потом ещё в MDN поискать собирался.
                          Ответить
                        • И я поверил. Согласен с новогодним петухом по поводу масштабов фигни.
                          Ответить
                          • От тебя не ожидал!
                            Ответить
                            • Я подотстал от новой питушни. Слишком много её.
                              Ответить
                              • Я отстал от питушни
                                Питушня свинцовой кастрюлей повисла над нами
                                Ответить
                      • У меня был случай, когда у юзера распидорасило жопоскрипт из-за русского комментария («\n» затерялся). Сванговал в чём может быть проблема и воспроизвёл, оказалось у него в браузере была установлена какая-то японская кодировка.
                        Ответить
                        • Любого, кто использует комментарии не на английском, следует четвертовать через повешанье на электрическом стуле.
                          Ответить
                          • Почему нет, если вся команда русскоязычная?
                            Ответить
                            • Ну ты же только что привел реальный пример.
                              Ответить
                        • Самое страшное в JS — подразумеваемая точка с запятой (забыл, как точно называется эта особенность).
                          Если, вставить лишний перенос строки, может случиться неожиданность. Допустим, фразу «return 42;» разбили переносом:
                          return
                          42;


                          Для JS «return» является законченным выражением (когда функция ничего не возвращает, как void в сишке), поэтому код будет интерпретироваться, как будто написано так:
                          return;
                          42;


                          Были реальные примеры, когда минимизаторы и обфускаторы JS портили код переносом в неудобном месте.
                          Ответить
                • Что надо было курить, чтобы придумать такой синтаксис регулярок?
                  Ответить
              • Почти да, но смотря что под ко-ко-контекстом понимать.
                Если необходимую для вычислений память: У лексера контекст структурно проще. Смотрит он конструкцию 0+"123", и на подходе к двойке ему нужно помнить, что он вошёл в строку - это будет его контекстом. У парсера контекст будет "вот эта питушня вроде подошла под набор хитрожопых правил с рекурсией.
                С другой стороны, название "КС" как бы намекает, что контекста нет, но это уже в другом смысле.
                Ответить
        • С какого хрена тогда он у них switch не понял?
          Какой C++ )))

          P.S. Идея для любителей понаотвечать на старые треды: если видите, что код читаемый и не содержит фич цпп2017+, пишите "Где здесь C++?"
          Ответить
          • В крайнем случае можно было сделать
            new switch (...)
            {
                ...
            }
            Ответить
            • А в жабе тоже были срачи за новые кейворды в паттерн-матчинге.

              Впрочем у них хватило ума switch не переименовывать. Там yield вместо break замутили.

              https://openjdk.java.net/jeps/354
              Ответить
              • озхуенно

                слово yield теперь есть в разных языках, и в каждом оно значит разное
                Ответить
                • Оно в каждом языке означает какую-то елду. Это почти как питушня, общее слово для труднообъяснимых явлений.
                  Ответить
      • Надо было «__inspect» называть?
        Ответить
        • нет, надо было ввести дополнительный символ.

          Скажем,

          @inspect
          Ответить
          • Прикреплять @ ко всякому говну это уже запатентованная Apple фича из Objective C. В суд подать могут
            Ответить
    • Питухи, кто понимает, как это работало: https://bugtraq.ru/library/underground/sprint.html ?
      Ответить

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