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

    +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
    function main() {
        let { aa, bb } = { aa: 10, bb: 20 };
        print(aa + bb);
    
        let {
            aa,
            bb: { q, r },
        } = { aa: 10, bb: { q: 1, r: 2 } };
        assert(aa == 10, "{}");
        assert(q == 1, "{}");
        assert(r == 2, "{}");
    
        let { x, y } = new ObjF(1, "foo");
        assert(x == 1, "{}");
        assert(y == "foo", "{}");
    
        print("done.");
    }

    Добрый вечер дорогие неопределившиеся... или заблудшие... вот я тут вам новую фичу притарабанил .. называет деконстракт :)

    Запостил: ASD_77, 04 Августа 2021

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

    • а для самых маленьких любознательных вылаживаю дампик .. что-то пошло не так и хрен вам а не дампик.
      Ответить
    • хотя нет - вот вам дампик https://pastebin.com/WCkSYX5x
      Ответить
    • > называет деконстракт

      В приличных домах это называют pattern matching
      Ответить
    • и исправленный код

      class ObjF {
        constructor(public x: number, public y: string) { }
      }
      
      function main() {
          let { aa, bb } = { aa: 10, bb: 20 };
          print(aa + bb);
      
          let {
              aa,
              bb: { q, r },
          } = { aa: 10, bb: { q: 1, r: 2 } };
          assert(aa == 10, "{}");
          assert(q == 1, "{}");
          assert(r == 2, "{}");
      
          let { x, y } = new ObjF(1, "foo");
          assert(x == 1, "{}");
          assert(y == "foo", "{}");
      
          print("done.");
      }
      Ответить
      • Это выглядит как непонятно нахуя нужный сахарок над структурами и инициализацией всякой хуйни.
        Ответить
      • > constructor(public x: number, public y: string) { }
        > let { x, y } = new ObjF(1, "foo");

        Счастливого рефакторинга.
        Ответить
        • Да, объекты наверное не стоило распидорашивать по позициям полей... Оно же не по именам матчит?
          Ответить
          • как это не по именам.. по ним самым :)
            Ответить
            • Тогда ладно. Похоже на расширение GHC NamedFieldPuns
              Ответить
            • Эм, а если мне надо два набора точек, к примеру, раздербанить, то как это записать?

              let {x1, y1} = f1();
              let {x2, y2} = f2();
              Ответить
              • вообще без проблем если это вернет { int, int }
                Ответить
                • Не, ObjF как в прошлом примере.

                  А с туплой {int, int} оно по позициям что ли будет работать, забив на имена?!
                  Ответить
                  • если вернуть [1, 2] то все будет ок. а если [ x: 1, y: 2} нихрена не сработает
                    Ответить
              • Захуярь туплой

                Или есть мудацкий синтаксис
                let {x:x1, y:y1} = F1()
                Ответить
                • Почему мудацкий?
                  Ответить
                  • Потому есть named tuples и эти объекты и получается случайный выбор между двумя неортогональными фичами
                    Ответить
                • так есть такой.
                  let {x=1, y=1} = F1();


                  правда я не буду его имплементировать пока, потому что у меня пока undefined - это тупая симуляция
                  Ответить
                • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
                  Ответить
                • или

                  const o = {p: 42, q: true};
                  const {p: foo, q: bar} = o;
                  
                  console.log(foo); // 42
                  console.log(bar); // true
                  Ответить
          • 1) Запилить фичу
            2) Продавать пивас студию для TypeScript'а, которая эту фичу запрещает
            Ответить
            • А в гомоиконном языке можно сразу в одной либе и фичу запилить и правило для пивас студии, которое эту фичу запрещает!
              Ответить
              • пивас студия тоже должна быть гомоиконной тогда, чтобы все гомоиконные фичи гомоиконно описывать.
                Ответить
              • Не ломай бизнес-модель. Хотя можно в компилятор встроить гомоиконный смарт-контракт, который за срабатывания правила будет с тебя снимать эфирчик.
                Ответить
    • В лиспе эта конструкция как-то ужасно называлась... (destructuring-binding (aa bb) x) что ли.
      Ответить
    • и результат работы

      C:\temp>C:\dev\TypeScriptCompiler\__build\tsc\bin\tsc.exe --emit=jit C:\temp\1.ts 
      30
      done.
      Ответить
    • и ссыль на репу https://github.com/ASDAlexander77/TypeScriptCompiler
      Ответить
    • о уже нафлудили пока я запостил
      Ответить
    • Какая вербозность для 2021
      Ответить
    • Да, давайте побольше встраивать непосредственно в язык всякий говносахарок, который можно было бы конструировать через компилтайм-библиотеку в языке с гомоиконностью или механизмом типа миксинов из D (которые полны по Тьюрингу).
      Ответить
      • Или как в «Nim» с помощью мокросов, шаблонов и редактирования AST.
        Ответить
    • Пуфыстик обожает выражения в левой части оператора присвоения.

      Например, в «Бейсике» в левой части можно было использовать строковые функции:
      10 NAME$ = "ВАСЯ"
      20 LET MID$(NAME$, 2, 2) = "ИТ"
      30 PRINT NAME$
      40 STOP
      50 END

      Программа выведет слово «ВИТЯ»
      Ответить
      • Годная питушня. Вот бы ещё можно было произвольные функции там использовать, чтобы движок языка всё трейсил взад:
        double x;
        (double -> double) f = x -> x*x - 8*x;
        f(x) = -16;
        print(x); // 4
        Ответить
        • В «Бейсике» было много интересных идей. Но все они выглядели, как игрушечные: можно было пользоваться только готовым, а своё добавлять было нельзя.

          Помню, можно было использовать слайсы для строк (функции MID$, LEFT$, RIGHT$) и, кажется, изменять длину строки (функция LEN). Дальше создатели «Бейсика» не пошли.

          А если бы развили эту мысль, было бы круто: декомпозиция, паттерн-матчинг, решение уравнений...

          У уравнений есть проблемы:
          1. У квадратного уравнения два корня.
          2. Многие уравнения нельзя обратить аналитически, а у решения методом итераций есть проблема останова.
          Ответить
          • А интересные идеи где?
            Ответить
          • > два корня
            Либо делать fork, либо интерпретировать код как do-нотацию монады List (строчки программы как бы умножаются декартово)

            Либо будет implementation defined и возвращать какое-то одно значение. Это вообще универсальный вариант. Поскольку форкнуться на 2 корня уравнения x: x^2-1=0 просто, а форкнуться на континуум корней уравнения x: 0=0 чуть сложнее.

            > нельзя обратить аналитически
            Бросать исключение или ошибку компиляции, если в тот момент известно?

            > проблема останова
            Не так важно с точки зрения языка. Пусть пердолятся программисты/пользователи.
            Ответить
      • Так вот откуда Гнидо взял присваивание слайсам.
        >>> a = [0, 1, 2, 3, 4, 5, 6]
        >>> a[5:0:-2] = 'a', 'b', 'c'
        >>> a
        [0, 'c', 2, 'b', 4, 'a', 6]
        Ответить
        • Вообще на первый взгляд «Питон» чем-то напоминает «Бейсик»: так же чувствителен к переводу строки...

          Жаль, в «Бейсике» не было слайсов для массивов, был только доступ к отдельному элементу.
          Ответить
        • К слову, а в каких ещё ЯП в левой части можно что-то делать?
          Ответить
          • С++
            Ответить
            • Покажи реальный пример (ну кроме разыменования и инкремента).
              Ответить
              • v[45] = true для vector<bool>. Оно там аккуратно впишет 45 бит куда надо.
                Ответить
                • Достигается перегрузкой = ?
                  Ответить
                  • Да. Либо ты возвращаешь ссылку и значение впишется напрямую, либо ты возвращаешь прокси с перегрузкой присваивания.
                    Ответить
                    • С возвратом ссылки в С++ есть еще такой код
                      petuh.getFoo() = 42;

                      это вызывает охуение у большинства питухов
                      Ответить
                      • Я бы на ревью не пропустила... Или уж оставь структурой или допиши сеттер по-человечески.
                        Ответить
                      • Понял. Слева может быть вообще произвольное выражение, результат которого — ссылка. Тогда и перегружать = не нужно.

                        Это как в сишке, если getFoo() возвращает указатель, то можно *(getFoo()) = 42;
                        Ответить
              • Питушня
                Ответить
              • #include <iostream>
                #include <utility>
                
                int main()
                {
                    auto point = std::pair(10, 20);
                    auto & [x, y] = point;
                    x = 42;
                    
                    std::cout << point.first << ", " << point.second << std::endl;  // 42, 20
                }
                Ответить
                • С auto вообще интересно.
                  Ответить
                • Кстати, а в рейнджах сделали сплайсинг строк/векторов как в твоём примере напитоне?
                  Ответить
                • Пропустил через «cppinsights»:
                  #include <iostream>
                  #include <utility>
                  
                  int main()
                  {
                    std::pair<int, int> point = std::pair<int, int>(10, 20);
                    std::pair<int, int> & __point7 = point;
                    int & x = std::get<0UL>(__point7);
                    int & y = std::get<1UL>(__point7);
                    x = 42;
                    std::operator<<(std::cout.operator<<(point.first), ", ").operator<<(point.second).operator<<(std::endl);
                  }


                  Создаёт временную переменную и производит декомпозицию.
                  Ответить
                  • А что ты ожидал там увидеть?
                    Ответить
                    • Я не знаю, что означают квадратные скобочки.
                      Ответить
                      • деконструкт же
                        Ответить
                        • Ну вот теперь знаю.
                          Ответить
                        • Кстати, что эта конструкция умеет деконструировать?
                          Ответить
                          • https://en.cppreference.com/w/cpp/language/structured_binding

                            Это есть примерно во всей скриптушне и в котлине еще вроде
                            Ответить
                          • жанр
                            Ответить
                            • Данное утверждение, фактически, стало аксиомой. Деконструкция жанра в аниме — значит «Ева», «Ева» — значит деконструкция жанра в аниме. Но так ли это?
                              Ответить
                              • аниме не нужно
                                Ответить
                                • А мать другой подружки главного героя повесилась, из-за чего та периодически проявляет агрессию, но при этом требует внимания и признания, а также интересуется мужчиной гораздо старше себя. Этим же мужчиной интересуются и другая героиня, исполняющая функцию матери для главного героя. В свою очередь, упомянутый мужчина интересуется своими арбузами.
                                  Ответить
                                  • ебать, да это же я

                                    только мной никто не интересуется и арбузов у меня нет, а так один в один!
                                    Ответить
          • R
            Ответить
            • И тут тоже интересуют реальные примеры для иллюстрации.
              Ответить
              • Перевёл пример госта
                https://ideone.com/crF1zG

                a = c(0, 1, 2, 3, 4, 5, 6)
                a[seq(6, 1, -2)] = c("a", "b", "c")
                print(a) # [1] "0" "c" "2" "b" "4" "a" "6"
                Ответить
    • прыщебляди соснули
      https://tjournal.ru/tech/420240-inzhener-google-yadro-linux-slishkom-opasno-dlya-android-iz-za-slozhnosti-i-rosta-uyazvimostey-ego-nuzhno-peredelyvat?from=rss
      Ответить
      • Самый пиздец в «Андроиде» в том, что производители железок блокируют загрузчик, и хрен ты ядро поменяешь. «fastboot oem unlock» работает далеко не везде. Да и после разблокировки могут внезапно перестать работать всякие банковские приложения, потому что они через чтение свойств системы узнают о разблокировке.
        Ответить
      • > from=rss

        – ебать ты олд
        Ответить

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