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

    −8

    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
    class C
    {
    	val: number;
    
    	constructor()
    	{
    		this.val = 2;
    	}
    }
    
    function o(val? : C)
    {
    	print(val?.val);
    }
    
    function main()
    {
    	o(new C());
    	o(null);
    	o();
    }

    Новый говнокод подоспел.... а как тебе такое слабый ужасный С/C++ ... ты так умеешь?

    Результат работы:

    C:\temp>C:\dev\TypeScriptCompiler\__build\tsc\bin\tsc.exe --emit=jit --opt --shared-libs=C:\dev\TypeScriptCompiler\__build\tsc\bin\TypeScriptRuntime.dll C:\temp\1.ts
    2
    0
    0

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

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

    • дампик тут... https://pastebin.com/KxUFNuXz
      Ответить
    • void o(std::optional<int> val = std::nullopt)
      {
          std::cout << val.value_or(0) << '\n';
      }

      Дальше лень, но принцип понятен.
      Ответить
      • что это за говно std::nullopt ?
        Ответить
        • Универсальная пустышка для optional'ов. Чтобы явно выбрать пустой конструктор.
          Ответить
        • Ff FF w qf444444
          Ответить
      • ого, в кресты завезли джаву
        Ответить
      • > val?.val

        Этого сахерку нету.

        Хотя конечно можно поспорить нужен ли он в строго типизированном языке.
        Ответить
        • нужен есть у тебя есть юнионы...
          Ответить
          • Хуюнионы.
            Ответить
            • "?." просто проверяет на null или undefined
              Ответить
            • пруфани
              Ответить
              • хуяфани
                Ответить
                • Как известно, в русском языке есть некая странная возможность - практически к каждому существительному приделать "хуёвое начало", охуить его. Скажем - "тарелка-хуелка", "профессор-хуессор", "чайник-хуяйник". В некоторых случаях это приводит к редукции (например, "тарелка", "грелка", и "стрелка" дают одну и туже "хуелку"), в некоторых же - образуются довольно забавные и легко узнаваемые слова. Но произвести эту нехитрую процедуру можно почти над любым словом.

                  Интересно, что получается в случае попытки приделать "хуёвое начало" к слову "хуй". Практически все опрошенные однозначно отвечали "хуюй". Однако, к слову "хуюй" уже ничего не приделаешь: попытка охуить хуюй даёт всё тот же самый хуюй.

                  Из этого вывод. Если сравнить процедуру хуения с дифференцированием (на каковое она похожа - в частности, и з-за редукций: (грелка)' = (стрелка)' = хуелка, то загадочный ХУЮЙ оказывается чем-то вроде показательной функции с основанием e: (ХУЮЙ)' = ХУЮЙ. Во всяком случае, исключительное место этого лингвистического адаманта, "не искажаемого никакоже", не подлежит сомнению.

                  Скорее всего, ХУЮЙ - это заклинание, слово Истинной Речи. Думаю, его действие состоит в том, чтобы рассеивать действия иных заклятий, прежде всего злохульных.
                  Ответить
    • val: number;
      
      o(null); //0
      o();     //0

      Почему 0? А не undefined или null? Где консистентность с жс.

      Даже в таком простом примере результат уже не понятен интуитивно. Фича стрёмная, если в пустяках начинаются шарады.
      Ответить
      • Я думал, 2 выведет (типа если объекта нет, а нужно его поле, то сконструируем по умолчанию)
        Ответить
        • Тоже вариант. 0 вообще не очевиден.
          Ответить
          • Ну типа дефолтное значение int'а.
            Ответить
            • > дефолтное значение int'а

              В соседнем треде мы уже выяснили что: There is no int type in Typescript.

              А дефолтное значение пельменных в JS — undefined.
              Ответить
              • Ну и нахуй нужна такая "типизация"?
                Ответить
                • Ну TS же не виноват, что ему нужно сохранять совместимость с JS.. Он старается улучшить ситуацию, как может

                  1. си: стат типизация нужна компилятору. Программист её реализует, так уж и быть
                  2. JS: урааа, никакой стат типизации
                  3. TS: стат типизация нужна программисту. Компилятор её реализует, так уж и быть
                  Ответить
              • это мой компилятор а не какой -то там NodeJS.. у меня есть все
                Ответить
              • пиши в моем коде type int = TypeOf<1>; и все у тебя есть целый тип
                Ответить
      • это у меня так принт работает. результат будет "undefined of int" там, где null или empty но print печатает как 0 ... это временный хак
        Ответить
        • > undefined of int

          Какая типизация )))
          Ответить
          • что тут не понятно... "значение поля val" это тип "number", но т.к. обьект отсутсвует то значение "?.<field:number>" -> "undefined of number" :)
            Ответить
            • У вас там в каждом типе есть значение undefined?
              Ответить
              • Интересно, а бывает null undefined или undefined undefined?
                Ответить
              • нет. это тупо структура optional<number> -> struct { bool isUndefined; number val; }
                Ответить
                • Чему равен val когда isUndefined == true?
                  Ответить
                  • случайному числу... обычно 0 т.к. все структуры обнуляются автоматом но это не требуется... т.к. имеем ввиду что значение "любое случайное"
                    Ответить
                    • А, результатом x?.val тоже является optional<number>? Всё, тогда понятно как этот сахар работает.
                      Ответить
                      • верно.... "?." создаст ответ как optional<number> т.е. если есть обьект - есть значение. нет обьекта есть undefined
                        Ответить
                        • А методы тоже работают?

                          Т.е. x?.foo() при x == undefined вернёт undefined и ничего не позовёт?

                          З.Ы. Уроки тайпскрипта на гк.
                          Ответить
                          • Это не тайпскрипт.

                            AFAIK эту пишутню сперва завезли в C#, а потом и остальные начали внедрять.

                            https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining

                            The optional chaining operator (?.) enables you to read the value of a property located deep within a chain of connected objects without having to check that each reference in the chain is valid.

                            The ?. operator is like the . chaining operator, except that instead of causing an error if a reference is nullish (null or undefined), the expression short-circuits with a return value of undefined. When used with function calls, it returns undefined if the given function does not exist.

                            This results in shorter and simpler expressions when accessing chained properties when the possibility exists that a reference may be missing. It can also be helpful while exploring the content of an object when there's no known guarantee as to which properties are required.


                            Там ещё такой синтаксис для методов
                            bagor?.pituz?.();

                            Ответить
                            • В коко тоже есть


                              getUser()?.foo?.bar?.buz

                              Кстати,
                              >вернёт undefined и ничего не позовёт?
                              напоминает яблочный nil
                              Ответить
                          • А как отличить, вернул ли метод undefined или undefined произошёл, потому что объекта нет?
                            Тут нужно сорта говна undefined'a делать:
                            undefined<indeterminate>
                            undefined<novalue>
                            undefined<emptyobjectmethodcall>
                            Ответить
                            • а зачем тебе отличать?
                              Ответить
                            • А зачем? Это ведь просто чтобы не городить мешок проверок при доступе к глубоко вложенной хуйне...

                              Если интересна промежуточная фигня -- можно разбить на более мелкие выражения и проверить на нужных уровнях.
                              Ответить
                            • x?.foo()?.data?.method() то общий результат может быть undefined и нам все равно на какой стадии это произошло ... главно что мы знаем что если есть данные тогда они не undefined
                              Ответить
                          • да методы точно также работают.. если функция возвращает данные тогда они будут обернуты в optional<xxx>
                            Ответить
                  • но переход от optional<Type> к Type -> { if Undefined -> default, otherwise -> value }
                    Ответить
    • o(val?
      u(gol!
      Ответить
    • // https://tio.run/##VU65CgIxEO3nKx6KkngsYul6IFvYiIWilRCWJGpAE1mzgojfviZe4BTDvOFdsruXsqrqxspjqTSGF6@MSw5jIn87a6V3uPiilB53QhhjPa75MaUHspQoQ8tY40XGwiU5vUmyOw4cjNBPX7jQviwsZFARXZ1RcCIKAqmDJEm@unMR7HdgtYba2lonBmES99tvgB6PFvXQylgNx6I2egmxmYrpcrYSAu0Xi2LRU24si3nfAMc@bZss4/cH5@nnvVjP5z/A/1r3QmRVPQE
      
      #include <stdio.h>
      
      typedef struct {
          int val;
      } C;
      
      C *init_C(C *c)
      {
          c->val = 2;
          return c;
      }
      
      void o_(C *val, ...)
      {
          printf ("%d\n", val ? val->val : 0);
      }
      #define o(...) o_(__VA_ARGS__ + 0);
      
      int main(void)
      {
          o(init_C(&(C){}));
          o(NULL);
          o();
          return 0;
      }
      Ответить
      • Ой, можно написать void o_(C *val), а не void o_(C *val, ...), тогда будут работать проверка на количество аргументов.

        Просто я сперва через va_list хотел нопейсать.
        Ответить
      • Отлично! -O5 Сишка слила заедушную скриптуху.
        Ответить
    • 3 billion devices run Log4shell
      Ответить

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