1. JavaScript / Говнокод #27863

    0

    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
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    type NetworkLoadingState = {
      state: "loading";
    };
    
    type NetworkFailedState = {
      state: "failed";
      code: number;
    };
    
    type NetworkSuccessState = {
      state: "success";
      response: {
        title: string;
        duration: number;
        summary: string;
      };
    };
    
    type NetworkState =
      | NetworkLoadingState
      | NetworkFailedState
      | NetworkSuccessState;
    
    
    function logger(state: NetworkState): string {
      switch (state.state) {
        case "loading":
          return "Downloading...";
        case "failed":
          // The type must be NetworkFailedState here,
          // so accessing the `code` field is safe
          return `Error ${state.code} downloading`;
        case "success":
          return `Downloaded ${state.response.title} - ${state.response.summary}`;
        default:
          return "<error>";
      }
    }
    
    function main() {
        print(logger({ state: "loading" }));
        print(logger({ state: "failed", code: 1.0 }));
        print(logger({ state: "success", response: { title: "title", duration: 10.0, summary: "summary" } }));
        print(logger({ state: "???" }));
        print("done.");
    }

    Ура... радуйтесь.... я вам еще говнокодца поднадкинул... ну и перекопал же говна в коде что бы это сделать. Дампик тут.. https://pastebin.com/u7XZ00LV Прикольно получается если скомпилить с оптимизацией то нихрена от кода не остается. и результат работы

    C:\temp\MLIR_to_exe>1.exe
    Downloading...
    Error 1 downloading
    Downloaded title - summary
    <error>
    done.

    Запостил: ASD_77, 10 Декабря 2021

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

    • а ты можешь так наговнокодить на C/C++?
      Ответить
      • struct NetworkLoadingState {};
        struct NetworkFailedState {};
        struct NetworkSuccessState { std::string title; std::chrono::duration duration; std::string summary };
        
        using NetworkState = std::variant<NetworkLoadingState, NetworkFailedState, NetworkSuccessState>;
        Сойдёт? Визитора для логирования я по памяти с первого раза не напишу, а конпелировать лень...
        Ответить
    • напоминаю это дексриминационные юнионы... (надеюсь правильно написал)
      Ответить
    • через ``std::variant`` могу, наверное, но будет некрасиво. Могу яжным способом через полиморфизм
      Ответить
      • так это же и есть основное нахрена надо TypeScript компилятор ... т..к. код то простейший а на C/C++ надо горы воротить..считай что свой движ туда пишешь
        Ответить
      • [delete]
        Ответить
    • > function logger
      А код подгружать через интернет умеет?
      Ответить
      • Downloading...
        Ответить
      • это вам к Жабистам... у меня такой х нет
        Ответить
        • А промисы? А генераторы?

          Алсо было бы хорошо в свой вариант TS-а добавить потоки, в которых можно выполнять произвольную функцию (а не только прибитый гвоздями fetch и т.д.).
          Ответить
          • gemerator-ы и подобие async/await тоже есть
            Ответить
          • > прибитый гвоздями fetch

            Эм, а web worker'ов нельзя ждать await'ом? Они, конечно, не полноценные треды, но всё равно что-то могут посчитать...
            Ответить
      • ```
        const executable = await fetch(...);
        const lib = dl.install(executable);
        const res = lib.run("someFunc", [param1, ..., paramN]);
        ```
        Ответить
    • О, мои любимые tagged union-ы
      Ответить
    • Что будет, если у двух типов из суммы будет одинаковый state, или не будет этого самого state?
      Ответить
      • Интересно ещё как конпелятор понимает, что дискриминация NetworkState идёт именно по state. Просто потому что первое?
        Ответить
        • вопервых он первый. во вторых state имеет только "literal" типы. т.е. единственное значение. или конст как в С++
          Ответить
          • Т.е. за дискриминатор берётся первое поле с типом literal?
            Ответить
            • угу
              Ответить
            • не берется. а вы используете первое поле. просто первое поле по определению самое безопасное т.к. находиться в одном и том же месте для любого похожего типа.
              Ответить
              • Блин, можешь привести цитату из спецификации языка, которая описывает эту механику? Я что-то уже окончательно запуталась.
                Ответить
                • та тут все просто...
                  у нас union { struct { int t = 0 }, struct { int t = 1, int code }, struct { int t = 2, ... } }. как мы определяем что у нас struct 1, 2 или 3? по полю t которое 0 для struct 1, 1 для struct 2, и 2 для struct 3
                  Ответить
                • а если в struct 2 перед t добавить "int x" .. то вся конструкция рушиться...
                  Ответить
                • Ты переодеваешься иногда в женскую одежду?
                  Ответить
                  • > иногда

                    Нет.
                    Ответить
                  • Иногда - это чтобы под..чить, пока жена не видит?
                    Ответить
                    • Блин, пиши слова полностью. Или заменяй синонимами, если полностью не нравится. Бесят эти точки-звёздочки...
                      Ответить
                      • Поддерживаю!

                        Питушня какая-то, читать сложно. Попробуй догадайся, что эти i100500n значат.
                        Помехоустойчивость тоже падает. Только недавно было какое-то редкое или написанное по ошибке выражение вроде "гулять в хуйцу", его со звёздочками никак не прочитаешь.

                        P.S. А синонимы - лучший вариант. Слова со звёздочками, написанные, "чтобы дети не видели" либо сразу понятны и детям, и взрослым (например, х*й) - тогда теряется смысл цензуры, либо не понятны сразу никому (например, в х**цу) - тогда теряется смысл сказанного. Синоним же всем понятен и полностью цензурен.
                        Ответить
                      • Какое доминирование )))
                        Ответить
                    • Это тебе кто, ASD_77 или хер собачий? Ночей не спал, cs2cpp написал, а ты при нём «под..чить».

                      Это тебе что, залупа конская на солнце светится или лоб пидора Сракера, за дела наши блядские лоб расхуячившего, а ты при нём «под..чить»?

                      А это тебе кто, потаскуха малолетняя или bormand, греха не знающая, хуя во рту не державшая, а ты при ней «под..чить»?

                      Марш на третью полку и не дрочить до Питера!
                      Ответить
            • просто safe cast происходит, когда тип может определиться .. а когда мы его может определить? если мы знаем значение поля в типе..(а не данных) или используем typeof
              Ответить
            • мы используем литерал потому что это гарантирует значение полей . можно использовать любое поле. просто... как тогда "промапить" значение поля к типу если это не "литерал"?
              Ответить
              • > можно использовать любое поле

                Но тогда кастовать надо будет явно, автоматика уже не сработает т.к. нету однозначно подходящего типа?
                Ответить
                • сработает. вы же в switch (state.state) указали что использовать "state" поле. по нему мы и определям тип
                  Ответить
      • Возможно в момент конпеляции switch'а происходит проверка? Там и state видно и варианты свича с вариантами state можно сопоставить. Наверное лучший момент, чтобы перечисленные тобой пункты проверить.
        Ответить
        • показать все, что скрытоПованивает ли твой хуй говном, bormand?
          Ответить
          • Главное, чтобы не мертвечиной. Если сей факт поимеет место, возможно две трактовки.
            1. этот человек некрофил.
            2. этот человек умер и его нюхает патологоанатом-извращуга.
            Ответить
      • если у них не будет то вы можете юзать только typeof который вернет одно и тоже значение для любого варианта.. т.е. тип перестанет быть полезным но рабочим
        Ответить
        • Что будет, если литерал одинаковый? Напр.
          type NetworkLoadingState = {
            state: "loading";
          };
           
          type NetworkFailedState = {
            state: "loading";
            code: number;
          };
          Ответить
          • в нормальном TS это значит, что по полю state определить класс невозможно
            Ответить
            • В общем, это типизация скорее уровня Erlang, а не ML.
              Ответить
            • Т.е. он останется NetworkState.
              Ответить
              • юнион от NetworkFailedState и NetworkLoadingState
                Ответить
                • О как. Интересный у вас вывод типов...
                  Ответить
                  • ну всмысле если peti.state == "loading", petuih тут очевидно или failed или loading
                    Ответить
                    • А если я "loading" из джвух кусков склею в рантайме?
                      Ответить
                      • тогда скорее всего хуй
                        будет или NetworkState или any, смотря что еще провериш
                        Ответить

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