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

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 j123123, (Updated )

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

  • О, паттерн-матчинг завезли! Полезная штука, жаль только, что, как всегда, получилось перегруженное, вербозное и костыльное говно.
    Кстати, в 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++».
    Ответить
      • Оператор сатурн нужен только там, где есть перегрузка по возвращаемому значению.
        Именно её и не хватает в С++.
        Хотя при наличии операторов для каста ее легко реализовать
        Ответить
    • Предлагаю встроить в компилятор язык правил из 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 с регулярками. Правда, там всё легко читается.
        Ответить
    • int eval(const Expr& expr) {
          return inspect (expr) {
              <int> i => i,
              <Neg> [*? e] => -eval(e),


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

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

          Ну типичный С++ way. Взяли нормальную идею и дико всё усложнили.
          Ответить
        • 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
          Ответить
          • Может быть, проще уже сделать компилятор «Перла» в нативный код, чем дорабатывать кресты?
            Ответить
            • Нет. С++ нужно ещё больше доработок.

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

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

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

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

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

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

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

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


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


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

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

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

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

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

        Скажем,

        @inspect
        Ответить

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

Семь раз отмерь — один отрежь, guest!

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


    8