ЙажаСценарий / Говнокод #27863 Ссылка на оригинал

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

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

    • 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++ надо горы воротить..считай что свой движ туда пишешь
      Ответить
      • А промисы? А генераторы?

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

          Эм, а web worker'ов нельзя ждать await'ом? Они, конечно, не полноценные треды, но всё равно что-то могут посчитать...
          Ответить
    • ```
      const executable = await fetch(...);
      const lib = dl.install(executable);
      const res = lib.run("someFunc", [param1, ..., paramN]);
      ```
      Ответить
  • Что будет, если у двух типов из суммы будет одинаковый 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 можно сопоставить. Наверное лучший момент, чтобы перечисленные тобой пункты проверить.
      Ответить
        • Главное, чтобы не мертвечиной. Если сей факт поимеет место, возможно две трактовки.
          1. этот человек некрофил.
          2. этот человек умер и его нюхает патологоанатом-извращуга.
          Ответить
    • если у них не будет то вы можете юзать только typeof который вернет одно и тоже значение для любого варианта.. т.е. тип перестанет быть полезным но рабочим
      Ответить
      • Что будет, если литерал одинаковый? Напр.
        type NetworkLoadingState = {
          state: "loading";
        };
         
        type NetworkFailedState = {
          state: "loading";
          code: number;
        };
        Ответить
        • в нормальном TS это значит, что по полю state определить класс невозможно
          Ответить
          • В общем, это типизация скорее уровня Erlang, а не ML.
            Ответить
            • юнион от NetworkFailedState и NetworkLoadingState
              Ответить
                • ну всмысле если peti.state == "loading", petuih тут очевидно или failed или loading
                  Ответить
                    • тогда скорее всего хуй
                      будет или NetworkState или any, смотря что еще провериш
                      Ответить

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

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

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


    8