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

    +1

    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
    class C {
        _length: number;
    
        constructor() {
            this._length = 10;
        }
    
        get length() {
            return this._length;
        }
        set length(value: number) {
            this._length = value;
        }
    }
    
    function main() {
        const c = new C();
    
        print(c.length);
        c.length = 20;
        print(c.length);
    
        delete c;
    
        print("done.");
    }

    пока вы тут балаболили я тут наговнокодил "property" или "accessors"

    Запостил: ASD_77, 07 Июля 2021

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

    • и по традиции результат работы

      C:\temp>tsc.exe --emit=jit C:\temp\1.ts 
      10.000000
      20.000000
      done.


      и дампик https://pastebin.com/hhZLyDBw в LLVM IR и LLVM MLIR https://pastebin.com/0W5H2rJ4
      Ответить
    • почему еще никто не пришел :)?
      Ответить
      • Потому что скучная фича.

        А через c['length'] эти свойства доступны? Или в TS эту фичу спрятали?
        Ответить
        • с чего бы их выпилили?
          оно аботает, посто типизиованное
          const Foo =  {
              get length():number {
                  return 42;
              }
          };
          
          console.log(Foo["length"]);
          Ответить
          • > посто типизиованное

            Хуяссе, а как вы там типизированную гетерогенную мапу запилили? Что за ёбаная магия?

            Тип возвращаемого значения зависит от значения ключа? Да у вас там coq практически...
            Ответить
            • > Да у вас там coq практически..

              Опровергаю.
              Ответить
            • Язык будущего. Вот в V8 при добавлении питуху свойства он переходил от одного типа (struct Pituz -> struct PituzSoSvojstvom) к другому, чтобы доступ к полям был быстрый и не зашквариваться до состояния словарей, но в то же время не был дубовым как C++, где список свойств назначает один раз автор класса.
              Такая питушня с оптимизациями и проверки типов могут поднять ИТ до небес.
              Ответить
            • мы это кто? Я не Андрес.

              Да ты сам проверь
              // https://www.typescriptlang.org/play
              const Foo =  {
                  get length():number {
                      return 42;
                  },
                  foo: "bgg"
              };
              
              console.log(Foo["length"].toExponential());
              console.log(Foo["foo"].toUpperCase());
              
              /** * uncomment me to sosnut an error
              console.log(Foo["foo"].toExponential());
              console.log(Foo["length"].toUpperCase());
              **/
              Ответить
              • Такая питушня и в ЖС работает, и в пистоне. Это проявление динамической питушни.

                А Борманд хотел спросить, наверно, что будет, если, скажем, запихнуть Foo['length'] в add : (number, number) -> number.
                Ответить
                • причем тут динамическая питушня? Мы про TS: тип проверяется в момент компиляции. Если раскомментировать код, то он не скомпилируется

                  ни в JS, ни в питоне стат типизация не проверяется без спец средств.

                  Борманд имел ввиду, что значение мапы зависит от ключа.
                  В C#, Java или C++ такое выразить не просто
                  Ответить
                  • > причем тут динамическая питушня?
                    Ну что в жс такая же питушня сработает.
                    И что выражение на первый взгляд выглядит так, как будто в нём никому нет дела до проверки типов.
                    Ответить
                  • > значение мапы зависит от ключа

                    Тип значения мапы зависит от значения ключа. В крестах такое вообще не выразить, разве что для кейсов, когда значения ключей заранее известны. Ну в общем-то и в тс точно так же, как мы выяснили ниже.
                    Ответить
            • >типизированную гетерогенную мапу запилили

              есть discriminated unions

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

                Ну это, по сути, подобие енума получится, а не "строка"? Обычную строку, которая мне от юзера пришла, туда уже никак не просунуть?
                Ответить
                • в тс можно сделать частью сигнатуры функции вывод типа, мол, функция вернула true - значит у аргумента тип Foo. Напиши такую функцию, проверяй ей - компилятор поверит и сузит тип со строки до множества значений
                  Ответить
                  • А, круто. Но это видимо ещё с if'ом надо совместить? Тогда внутри if'а тип будет правильный.
                    Ответить
                    • да

                      ну или в `else` если в ифе отрицание

                      или вообще если в ифе отрицание и там гарантирован return

                      или вообще в свитче (енам по значениям точно разберет, про функцию не уверен)
                      Ответить
                      • Ну принцип понятен, да. Там где инвариант про check(x) действует, там и можно юзать конкретный тип.

                        Круто сделали.
                        Ответить
                        • >круто

                          очень, угу


                          Вообще даже обидно, что скриптоблядям вебовским такой годный язык достался
                          Ответить
                          • будь не вебовской

                            https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/discriminated-unions
                            Ответить
                            • Хуясе, у вас там в шарпик прям настоящие ADT завезли, как в функциональщине?!

                              А тьфу, это F#.
                              Ответить
                            • с функциональщиной-то всё понятно)
                              Ответить
                              • думаешь, пора учить?
                                Ответить
                                • Для расширения сознания можно. Юзать -- ну такое, разве что ради job security. Где ты потом будешь искать девочек-волшебниц на поддержку.
                                  Ответить
                                  • У него интероп с C#, он же CLR

                                    заменишь девочку на ротоёба, и язык поменяешь
                                    Ответить
                                    • When learning F#, you should not try to bring your old imperative concepts with you.

                                      императивомразь!
                                      Ответить
                                    • > и язык поменяешь

                                      Боюсь, что не прокатит т.к. вся архитектура уже заточена под какие-нибудь реактивные паттерны да всякие кобенаторы, которые в шарпике будут выглядеть как говно. Да и старый код прочитать будет некому.

                                      Так что интероп здесь в одну сторону.
                                      Ответить
                                      • можно писать ядро на сишарпе, а прикладуху на фишарпе

                                        вот бизнес порадуется! будет полное nevmerle!
                                        Ответить
                                • я малость читал про F#, мне показалось интересно

                                  если бы я писал под .NET плотно, то вероятно бы выучил..
                                  Ответить
                          • В котором из структур данных ничего нет, кроме голых объектов и массивов? В последних версиях еще Map/Set/WeakMap/WeakSet правда завезли + есть всякие Uint8Array/.. косплеющие статические массивы, но до той же джавовской std ЖС-у еще далеко.
                            Ответить
                            • В TS ничего вообще нет: что-либо есть только в JS
                              Ответить
                            • Нет
                              Ответить
                              • По набору структур данных в стандартной библиотеке - да (тех же связных списков, priority queue, обычной очереди нету).
                                Ответить
                                • в npm есть стопудово

                                  жаль конечно, что в стандартной библиотеке нихуя нет
                                  Ответить
                                  • Только на интервью тебе не дадут пользоваться сторонними либами хех.
                                    Ответить
                                • >обычной очереди

                                  Массив реализует интерфейс очереди

                                  >связных списков, priority queue

                                  Задачи с литкода рекомендую всё-таки решать на питоне или джаве
                                  Ответить
                                  • >Массив реализует интерфейс очереди
                                    не очень производительно

                                    >Задачи с литкода рекомендую всё-таки решать на питоне или джаве

                                    почему, кстати?
                                    Ответить
                                    • >не очень производительно

                                      Какая производительность )))

                                      >почему, кстати?

                                      1) там все перечисленное JaneBurt есть
                                      2) интервьюер на алгоритмической секции с большей вероятностью знает их чем жс
                                      Ответить
                                  • > priority queue

                                    Ну priority queue -- это всё-таки практическая штука, а не хрень для лаб.
                                    Ответить
                                    • >А вот связные списки в жс действительно ни к чему.
                                      Если я буду перманентно срать в голову массиву размером в гигабайт, то могу и соснуть

                                      С другой стороны, современные процы умеют неплохо двигать последовательные куски данных
                                      Ответить
                                  • > Массив реализует интерфейс очереди

                                    А вставка/удаление в начало работает за O(n) . У труЪевой очереди ето работает за O(1).

                                    > Задачи с литкода рекомендую всё-таки решать на питоне или джаве

                                    Я не думаю, что в том же Яндексе алгоритмическую секцию дадут решать на каком угодно ЯПе. Раз я подаюсь на позицию с ЖС, мне надо писать на ЖС.
                                    Ответить
                                    • >А вставка/удаление в начало работает за O(n) . У труЪевой очереди ето работает за O(1).

                                      Какой перформанс )))

                                      >Раз я подаюсь на позицию с ЖС, мне надо писать на ЖС.

                                      Мне это кажется добровольным усложнением жизни но флаг тебе в руки
                                      Ответить
                                      • >Какой перформанс )))


                                        JSер не обязан знать, чем массив отличается от листа, а O(1) от O(n)
                                        Ответить
                                        • В js нет никаких массивов, а есть гарантия стандарта что ключи объекта которые парсятся в целое число будут перечислены по возрастанию

                                          Глистов тоже нет только деревья
                                          Ответить
                                          • >В js нет никаких массиво
                                            https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array

                                            мы вам этсамое
                                            Ответить
                                            • Это не массив

                                              Массив это Uint8Array он вроде обязан выделить сплошной кусок памяти

                                              А array не обязан
                                              Ответить
                                              • >А array не обязан
                                                охуясе, то есть доступ к Array[42] не за O(N)?!

                                                у вас там в джсе всё такое?
                                                Ответить
                                                • Array может быть реализован хешмапой

                                                  Ты никогда не задумывался как работает индексация Array если в объекте ключи могут быть только строками или символами?
                                                  Ответить
                                                  • я думал, строки там отдельную мапу образуют, как и у любого объекта

                                                    а сам эррей массивом

                                                    ну если он хештаблой, то как же тогда перечислять его?
                                                    Ответить
                                                    • Стандарт гарантирует что ключи которые парсятся в число перечисляются строго по возрастанию и перед остальными строковыми ключами
                                                      Ответить
                                            • То ли дело PHP - там массив это "ordered map"
                                              https://www.php.net/manual/en/language.types.array.php
                                              Ответить
                                              • нахуя называть arrayем то, што им не являеца?

                                                ну назовите лист тада, або сиквенс
                                                Ответить
                                              • Более того, в «PHP» у одного «массива» могут быть как числовые ключи, так и строковые. И самое интересное, что ключи могут быть произвольно упорядочены. По сути ключи лежат в отдельном массиве.
                                                Ответить
          • А Foo["leng" + "th"] будет работать?
            Ответить
            • нед
              буде Element implicitly has an 'any' type because expression of type 'string' can't be used to index type
              Ответить
              • Какой '</scr' + 'ipt>' )))
                Ответить
              • Фу, читеры. А я уж думала, там реально зависимые типы подвезли.

                А что будет, если я в это any засуну "42"? Мне не дадут это сделать в компайлтайме или рантайме? Или просто читатели потом охуеют от разрушенных инвариантов?
                Ответить
                • в рантайме ты можешь что угодно делать, если там эни
                  все сломаешь, и сам виноват

                  тайпскрипт НЕ ВЛИЯЕТ НА РАНТАЙМ


                  >зависимыетипы
                  там тока так
                  https://www.typescriptlang.org/docs/handbook/2/mapped-types.html
                  Ответить
                  • Ну ладно, хоть ворнинг выдал и ня том спасибо. Или твоя цитата выше -- это не ворнинг а просто цитата из доки?
                    Ответить
                  • у меня тоже есть типа
                    type SmallNumber = (0 | 1) | (1 | 2) | 2;
                    Ответить
            • Выводит как any
              Ответить
            • с парой присседаний - да
              Foo[`${'le'}${'ngth'}` as const]
              Ответить
        • пока не доступна такая фича. но можно будет переписать оператор и всунуть костыль для такой поддержки - просто мне это пока не интересно
          Ответить
        • напиши такую фичу на С или С++... узнаешь насколько скушная
          Ответить
      • Потому, что сторонний наблюдатель обычно эмоционально реагирует только на качественно новый класс достижения, а всё остальное его мозг сжимает.

        * Создан продукт с 1 фичей - очень интересно.
        * Добавлена фича - ну ладно.
        * Стало 3 фичи - зачем? Ты просто досчитал до трёх. Расскажи, когда будет скачок.
        * Стало 10 фич - интересно
        * Стало 100 фич - ну ладно
        * Стало 1000 фич - зачем? Ты просто досчитал до трёх по логарифмической шкале. Расскажи, когда будет скачок.
        * Код использует вся страна - интересно
        * Код использует вся планета - ну ладно
        * Код использует вся галактика - зачем? Ты просто досчитал до трёх по вселенской шкале. Расскажи, когда будет скачок.

        Так что штука крутая, но из-за особенностей восприятия она будет всё больше и больше недооцениваться.
        Ответить
      • Что, никто не знает?
        Ответить

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