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

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

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

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

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

                    Это вообще багор
                    Ответить
                    • Код с однострочными комментариями распидорасит?
                      Ответить
                      • Нет, просто во втором случае, я зелёный цвет забыл поставить.
                        Ответить
                      • У меня был случай, когда у юзера распидорасило жопоскрипт из-за русского комментария («\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
              Ответить
      • Надо было «__inspect» называть?
        Ответить
    • показать все, что скрытоvanished
      Ответить

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