1. C++ / Говнокод #26455

    +1

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    // https://habr.com/ru/post/490222/
    
    Почему мы должны сломать ABI
    
    Прежде всего, есть несколько полезных изменений в реализации стандартной библиотеки, которые можно внедрить, если нарушить текущий ABI:
    
    ...
    
    * Ускорить работу std::regex (На данный момент быстрее запустить PHP и выполнить на нем поиск по регулярному выражению, чем использовать стандартный std::regex)

    Какой багор! Именно поэтому я за PHP

    Запостил: j123123, 28 Февраля 2020

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

    • > Во время разработки модулей для C++23 мы снова столкнемся с проблемами ABI, потому что все не-экспортируемые символы должны будут оставаться в глобальной части модуля, чтобы не сломать ABI. Этот факт в принципе уничтожает весь смысл модулей как таковых

      Блядь, как всё сложно. Модули-хуёдули, ABI какие-то. Взять бы всё, и на ассемблер переписать.
      Ответить
      • >std::unique_ptr мог бы храниться в регистре с помощью некоторых модификаций в языке, что сделало бы его zero-overhead по сравнению с обычным указателем

        C этого момента поподробней.
        Ответить
        • Пардон, но ведь std::unique_ptr — это и есть zero-overhead по сравнению с обычным указателем. По памяти в том числе.
          Ответить
          • >std::unique_ptr — это и есть zero-overhead по сравнению с обычным указателем

            Как оказалось не совсем.

            Крестушачие конструкторы/деструкторы всё портят.
            https://youtu.be/MWBfmmg8-Yo?t=484
            Ответить
            • Какой анскилл (((
              Ответить
              • Он там дальше рассказывает что в кресты хотят завезти move-семантику моей мечты: схлопывать new+delete в memcopy в случае НЕтривиальности конструкторов/деструкторов.
                Ответить
                • Ещё чуть-чуть и прямо в рай ССЫЛОЧНАЯ ПРОЗРАЧНОСТЬ вместо ссылочной призрачности.
                  Ответить
      • Вы чаи пьёте да им про разные ABI говорите. Им надо чтоб их ёбом крыли с утра до вечера тогда они мож немного одумаются. А вы всё обратной совместимостью да модулями. Ассемблером им а не модулями надо. Вот как.
        Ответить
    • > Предполагаемая потеря в производительности библиотеки из-за нашего нежелания нарушать ABI оценивается в 5-10%. Это число будет только расти со временем. Давайте посмотрим на примерах:

      > Если вы разработчик встраиваемых систем, то эти 5% могут стать гранью между работающим продуктом и необходимостью купить более дорогой и мощный чип, а он может стоить миллионы

      А не пойти бы вам нахуй? Никакой гранью это не станет, это просто приведет к выкидыванию нахуй этой вашей триждыблядской крестоговняной стдлибы (возможно даже вместе с самим крестоговном и переходом на Си)
      Ответить
      • 5-10% - вообще питушня. Большего можно добиться хардварной эволюцией, некоторыми оптимизациями, или же вовсе перепостановкой задачи на более адекватную железу.
        Ответить
        • Это только для анскильных жаваскриптушков "5-10% - питушня". Для каких-нибудь датацентров, если какая-то питушня считается на 5-10% быстрее - это огромная экономия электроэнергии и вычислительных ресурсов
          Ответить
          • Так он же прав.
            А вы выдрали из контекста кусочек, и опровергли. И я плюсанул не глядя.

            >Большего можно добиться некоторыми оптимизациями
            Главное-то здесь!
            Лучшие алгоритмы дают ускорение НА ПОРЯДКИ.

            Не какая-то заумная хрень. А простой отказ от алгоритмов маляра Шлемиэля.

            Ассемблерные вставки в нужных местах дают ускорение В РАЗЫ.

            "5-10% - питушня", по сравнению с профитами проистекающими от других отпимизаций.
            Ответить
            • >> Большего можно добиться некоторыми оптимизациями
              > Главное-то здесь!
              > Лучшие алгоритмы дают ускорение НА ПОРЯДКИ.

              > Ассемблерные вставки в нужных местах дают ускорение В РАЗЫ.


              Бывает так, что алгоритм и так самый лучший. Но при этом улучшать еще есть куда, и это оправдано. И кстати, можно взять самый лучший алгоритм, реализовать его на какой-нибудь скриптушне, например напитоне и на ассемблере - там тоже ускорение от ассемблера может быть на порядки из-за некоторых говноособенностей скриптушни
              Ответить
    • > «Ускорить работу std::regex (На данный момент быстрее запустить PHP и выполнить на нем поиск по регулярному выражению, чем использовать стандартный std::regex)» — основное что тормозит в std::regex, это локали. Убрать локали — это изменение API а не ABI.

      В ассемблере никаких локалей нет. Именно поэтому я за ассемблер
      Ответить
      • >На данный момент быстрее запустить PHP и выполнить на нем поиск по регулярному выражению, чем использовать стандартный std::regex

        В ассемблере никаких regexов нет. Именно поэтому за «PHP».
        Ответить
    • >Return type of push_back could be improved with an ABI break

      Зачем? Зачем?
      Просто сделайте новый метод.
      Ответить
      • > Добавление новых имен

        > Это первое и очевидное решение. Если мы не можем поменять std::unordered_map, может нам просто добавить std::fast_map? Есть несколько причин, почему так делать плохо. Добавление типов в стандартную библиотеку обходится дорого как с точки зрения расходов на поддержку, так и с точки зрения образования. После введения нового класса неизбежно появятся тысячи статей, в которых объясняется, какой контейнер стоит использовать. К примеру, мне следует использовать std::scoped_lock или std::lock_guard? А я понятия не имею! Мне нужно каждый раз гуглить.
        Ответить
        • Что будет делать программист с языком программирования, стандарт которого занимает две страницы, прекрасно работает, и не требует изобретения новых стандартов? Правильно! Он забудет говностандартизаторов навсегда. Он не будет звонить в комитет по стандартизации, он не услышит там о новых версиях и пропозалах, ему не надо будет учиться на специально организованных курсах за свои деньги в течении трех лет. А вот если он потратил туеву хучу времени и денег на изучение монстра, ему подарили красивый диплом с вензелями и золотым обрезом, назвали Сертифицированным-Супер-Профессионалом-По-Крестоговну-Категории-Z-Неимоверной-Крутизны-С-Правом-Ковырять-В-Носу-В-Присутствии-Августейшего, если он почувствует эту неимоверную крутизну в кругу таких же дураков, преисполнится благодарности, и никогда не перейдет к другим языкам программирования. Как по моральным, так и по материальным причинам.
          Ответить
          • Поиграется с этим калькулятором и забьёт. Язык то может и хороший, но стандартной либы у него явно нет.
            Ответить
            • Именно поэтому я за «PHP».
              Ответить
              • у пхп нет спецификации, и именно потому у него богатая стандартная либа с mysqli_real_escape_string
                Ответить
                • И то верно.

                  А у «Оберона» спецификация чуть ли не на одной странице. Вру, одна страница на синтаксис, 20 страниц — полное описание. Стандартная либа состоит из питушни вроде Texts.Scan и Texts.WriteString. Реальный пример:
                  PROCEDURE Gcd*;
                  VAR x, y: INTEGER; S: Texts.Scanner;
                  BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos);
                  Texts.Scan(S); x := S.i; Texts.WriteString(W, " x ="); Texts.WriteInt(W, x, 6);
                  Texts.Scan(S); y := S.i; Texts.WriteString(W, " y ="); Texts.WriteInt(W, y, 6);
                  WHILE x # y DO
                  IF x > y THEN x := x-y ELSE y := y-x END
                  END;
                  Texts.WriteString(W, " gcd ="); Texts.WriteInt(W, x, 6); Texts.WriteLn(W);
                  Texts.Append(Oberon.Log, W.buf)
                  END Gcd;
                  Ответить
            • Стандартная либа может быть отдельным стандартом стандартизирована.
              А сколько страниц займет стандарт крестов, если из него выбросить стандартную либу? Я думаю что тоже очень и очень дохуя.
              Ответить
          • Предлагаю придумать идеальный язык и написать к нему стандарт на двух страницах А4. Ну так, чтобы он поддерживал x32 и x64 рахитектуры, все эти бигэндианы, машины с троичными байтами, разные модели памяти.

            Сишку, кстати, можно в две страницы формального описания уместить?
            Ответить
            • У сишки листов 200 сам язык. Не сильно проще крестов, я бы сказал.
              Ответить
              • Ну это божественный няшный стандарт или что там, а не еретический высер педокомитета, потому норм
                Ответить
              • Number of pages : 520
                https://www.iso.org/standard/74528.html

                Number of pages : 1605
                https://www.iso.org/standard/68564.html

                какой бугор
                Ответить
                • Логично. C - 1 символ, C++ - три символа, потому и стандарт в три раза больше.
                  Ответить
            • Ну в пару страниц только forth да tcl впишутся, если описания слов/функций оставить за кадром.
              Ответить
              • А ассемблеры всякие?
                Ответить
                • асемблеры разве что у z80.

                  у современнных интелов третьим томом девелопер гайда убить можно
                  Ответить
                  • Полная сборка всех томов - 5к листов. Ёбаный ад.
                    Ответить
                  • Поди защита и аппаратная многозадачность много весят? Или всякие SIMD?
                    Ответить
                    • Ну в томе с инструкциями - однозначно SIMD. А в томе для системщика одной виртуализации страниц на 500...

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

                      хотя, частично все таки наверное надо, хотябы чтб понимать как переключаются кольца защиты
                      Ответить
                      • Там ещё 64-битный режим на отъебись описан, в своё время пришлось вместе с amd'шной докой читать.
                        Ответить
              • а lisp?
                Ответить
              • Нельзя синтакс от слов отделять, слова тоже часть языка. Просто в большинстве остальных языков "слова" типа ключевых слов, операторов и пр. захардкожены в синтаксисе.
                Ответить
        • Да, я прочёл статью. В оригинале.

          Альтернатива, которую они предлагают: сломать нахуй всё, ради глупой питушни. Питушни, которую в будущем они ещё несколько раз поменяют.

          Это свидетельство анскильности комитета, который сперва бездумно принимает всякую хуйню. А когда она пошла в прод, пытается переделать её.

          >Ускорить работу std::regex (На данный момент быстрее запустить PHP и выполнить на нем поиск по регулярному выражению...)
          А нужно было просто сделать std::php::regex
          Ответить
          • > Это свидетельство анскильности комитета, который сперва бездумно принимает всякую хуйню.

            Именно поэтому я за Си - там комитет почти нихуя не меняет
            Ответить
            • Если в языкe за 10 лет практически ничего не меняется, значит он уже близок к совершенству.
              Ответить
          • > А нужно было просто сделать std::php::regex

            Ждем std::mysql::real_escape_string
            Ответить
        • scoped_lock умеет пачку мутексов захватывать, а lock_guard - только один. Вот и вся разница.

          З.Ы. А ещё там есть unique_lock...
          Ответить
      • > return type of push_back

        Но... там же void...
        Ответить
        • Вот они и хотят сделать improved_void.
          А вообще я джва года жду кококой-нибудь movable_pop_back(). Чтобы можно было не писать питушарское «x = vec.back(); vec.pop_back()».
          Ответить
          • Так они хотят возврат какой-то хуйни прикрутить к push_back.
            Зачем? Зачем?

            >можно было не писать питушарское «x = vec.back(); vec.pop_back()».
            > я джва года жду кококой-нибудь movable_pop_back()

            Комитет будет всякую хуйню апрувить, а реально полезные вещи вроде этой — нет.
            Ответить
    • Сделоли бы уже какой-нить новый С+++. Отпилили бы всякие немодные сишные рудименты типа сырых указателей, и обмазались своими модулями с функциональщиной.
      Ответить
      • Уже делали, например D. Но что-то не взлетел. Крестушки не хотят свое говно на принципиально новый язык переписывать, им надо чтоб старый язык подкостылили всяким дерьмом, с сохранением обратной совместимости
        Ответить
        • >I believe, quite strongly, that not breaking ABI in 23 is the worst mistake the committee ever made.
          Откуда такие сумасшедшие вообще лезут.
          Ответить
          • > сумасшедшие

            Сумасшедший тут только комитет, который живёт в своём мире со стабильным ABI с розовыми пони и не видит, что происходит в реальности...

            А в реальности только слабоумные и отважные решаются передавать std'шную хуйню между либами, собранными разными тулчейнами. Потому что в реальности какая-то мелочь да ломается. И проще пересобрать всё с нуля и не задумываться про ABIпроблемы.
            Ответить
            • > I also omitted ABI breakings operations that are also source breaks (removing or modifying functions).
              > But sometimes, removing functions is actually a useful non-breaking change.

              А я полагаю что автор. Который постоянно путает API и ABI
              Ответить
              • Там забавная ситуация... API стандартизаторы как раз таки не боятся ломать - в с++17 выпилили auto_ptr и кучу старого нинужного хлама.
                Ответить
                • То есть так у них работает обратная совместимость.
                  Когда питушня нравится ко-ко-комитету - "Как же, как же, столько кода сломается!"
                  Когда питушня не нравится ко-ко-комитету - "А хрен с вашими кучами кода. Перепишете!"
                  Ответить
        • В D нет сырых указателей?
          Ответить
          • А зачем надо чтоб их не было? Тогда язык потеряет свою нишу, это уже какая-то скриптушня получится
            Ответить
      • А сишарп не то?
        Ответить
        • Хороший язык, мне нравится. В исследовательском отделе лежит аффидевит на более глубокое изучение.
          Ответить
          • Не знаю как в 2020, но 10 лет назад надо было читать "CLR via C#" Джефри нашего Рихтера (того самого, что про програмирование под винду писал).

            Самая охуенная книга про шарпы, например
            Ответить
        • Хуйня с gc. Но для прикладнухи он хорош.
          Ответить
        • Это такой вариант жабы от мелкософта. Для микроконтроллеров непригоден, так что отправляется нахуй
          Ответить
          • Ну кстати в отличие от жабы, c# умеет value objects и гораздо более простой интероп с сями (PInvoke)
            Ответить
          • > Для микроконтроллеров не
            давай я тебе настроение испорчу, кстати
            https://micropython.org/
            Ответить
            • Всё хуже, уже есть аналог ардуины с js на борту. Подумаешь, проц в 10 раз мощнее пришлось поставить.
              Ответить
              • Для сисярпика кстати был .NET Micro Framework, а сейчас это бессмысленное и беспощадное дело продолжает nanoFramework.
                Ответить
              • еще бы флешку туда гигов на восемь для .node_modules
                Ответить
                • В «PHP» нет никаких .node_modules, там все нужные функции из коробки. Именно поэтому я за «PHP».
                  Ответить
                  • А если каких-то нет, то можно их написать, положить в fynkcii.php, и скопировать тотал коммандером на сервер

                    как там ваш гомпозер, кстати? тоже качает гигабайты?
                    Ответить
                    • Компостер для хипстеров всяких. Настоящие пэхапэшники вроде «Конардо» им не пользуются.
                      Ответить
            • Это всё хуйня тупая, которая сжирает ценные ресурсы контроллера, так что оно нахуй не нужно
              Ответить
              • зато позволяет писать макакам
                макаки си не знаюит: там байтики какие-то, хуяйтики
                Ответить
                • Нахуй не нужно, чтоб всякие макаки своими кривыми руками лезли в контроллеры. Разве что для школоты/студентоты анскильной подойдет, а для серьезных вещей это хуйня полная
                  Ответить
                  • А что мне делать, если я макака, но уже не школота?
                    Ответить
                    • изучай вордпресс
                      Ответить
                      • Кек! Обезьяньи наши руки. Под воздействием науки только дети или внуки станут, может быть, людьми.
                        Ответить
                        • https://i.imgur.com/eUOC0Ji.gif
                          Ответить
                          • ну там бы скорее был function, чем def всё таки
                            Ответить
                          • > В 2003 году Совет по искусству Англии решил доказать теорему на практике. Совет профинансировал шесть обезьян с целью выяснить, сколько им потребуется времени, чтобы напечатать сочинения Шекспира. Через полгода обезьянам не удалось набрать ни одного слова по-английски, они разломали компьютер и изгадили клавиатуру )))
                            Ответить
                            • Какой багор )))
                              Ответить
                            • Дык мало обезьян и мало времени... Надо было дождаться пока обезьяны создадут новую цивилизацию, изобретут компы и начнут печатать свои книги.
                              Ответить
                        • Хорошая цитата, сохранил.
                          Ответить
                  • Ты опоздал лет так на 6, когда сделали Arduino Yun как раз для этого.
                    Ответить
                    • Ну так я не отрицаю что подобное говно существует. Просто это тупая хрень для школоты и анскиллябр заедушных
                      Ответить
        • C# - это язык для богов
          а так как существование бога никому пока не удалось доказать,
          Ответить
    • Омг, сова хуёво натягивается на глобус
      Верните мне С++2003 пожалуйста
      Ответить
    • Именно поэтому я против крестов
      Ответить
    • > сломать ABI

      Как можно сломать то, чего нет?

      З.Ы. У конкретных компиляторов то оно есть, само собой. Но не в стандарте.
      Ответить
      • З.З.Ы. Причём эти самые конпеляторы и стандартные либы его регулярно ломают. И всем похуй.

        Стандартизаторы, видимо, живут в своём мире, где после выхода нового конпелятора не надо пересобирать всё крестодерьмо.
        Ответить
      • Нет, просто статью писала анскилябра, которая не видит разницы между API и ABI.

        По тону статьи оно звучит как API (сигнатуры методов, аргументы).

        Но меня насторожило другое. Предлагается сломать всё нахуй ради мифического пиздежа про 5% пирфоманса.
        Аргументы потрясающие:

        The estimated performance loss due to our unwillingness to break ABI is estimated to be 5-10% This number will grow over time. To put that in perspective
        > If you are a Big Tech company, you can buy a new data center or pay a team to maintain a library


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

        > If you are a game company, it might be the difference between your game being great or your user vomiting in their VR headset
        > If you are in trading, it might be the difference between a successful transaction or not.

        И вообще если судьба человечества так сильно зависит от 5% пирфоманса, что было бы если б вдруг рост процессорных частот остановился в районе 1-2Ггц. Походу коллапс мироздания.

        Анскильному отребью конечно неизвестно, что улучшение алгоритмов ускоряет программы В РАЗЫ.
        Ответить
        • Не, там речь именно про ABI.

          Представь, что ты добавил новый опциональный аргумент в какой-то метод. API не изменилось, старый код нормально скомпилится. А вот ABI сломано и неперекомпиленный код распидорасит при вызове.
          Ответить
          • у жабоёбов есть охуенный пример на эту тему.
            было
            void sosat(Petuh petuh) {
            }

            стало

            void sosat(Petuh... petuh) {
            }

            Апи остался прежним, а аби -- нет, бо варарг это массив под капотом. И всем пизда.

            Кстати, если я в няшной поменяю местами поля у структуры, то сломается ли аби? Там же смещение другое будет?
            А у жабы сломается, интересно?
            Ответить
            • Интересено выдумать такой пример, где есть крестометод кучей с перегрузкок, шаблонов, SFINAE всякими.

              И добавление новых аргументов не то чтобы ломает программу. Но заставляет вызываться другой перегруженный метод.
              Ответить
            • Апи остался прежним? srsly?
              Ответить
              • Старый код, который эту функцию вызывал, продолжает компилиться и работать. Т.е. API совместимо.
                Ответить
                • А ведь ты и гест правы, а я обосрамши.

                  И это пиздец. В Свифте точно такая же вафля.
                  Ответить
                • Было:
                  void a(Object o) {
                  }


                  Стало:

                  void a(Object... o) {
                  }


                  Вызов
                  a(new Object[]{1,2,3})
                  стал ходить в другую сигнатуру
                  Ответить
                  • В жабе можно передать в функцию с вараргом именно массив?
                    Ответить
                    • Конечно. Варарг — просто сахарок над массивом.
                      Ответить
                      • Ну, это понятно. Но, например, в Свифте:

                        func blabla(args: Int...) { }
                            
                        func azaza() {
                            blabla(args: [1, 2, 3])
                        }


                        посылает нахуй с "Cannot convert value of type '[Int]' to expected argument type 'Int'"
                        Ответить
                      • кажется, в котшлине надо явно сказать

                        foo(*myarr)
                        Ответить
                  • Какая консистентность )))

                    Я думал только скриптухи себе такие неоднозначные перегрузки позволяют... Как console.log() или конструктор массива в js, к примеру.

                    Т.е. мне придется писать new Object[](new Object[1, 2, 3])) чтобы вернуть старый смысл?
                    Ответить
                    • Как всё сложно... Именно поэтому я за «PHP».
                      Ответить
                    • А, это питушня как, если правильно помню, с фортрановскими массивами, где массивы были только на бумаге, а на практике - бесформенный набор значений, который мог передаться в функцию как питушня произвольной размерности.
                      Ответить
                    • Или % в "python".
                      Ответить
                    • Нет, ну можно же проще
                      (Object)(new Object[1, 2, 3]))


                      >Т.е. мне придется писать new Object[](new Object[1, 2, 3])) чтобы вернуть старый смысл?
                      Я бы так писать не стал. Вдруг там:
                      void a(Object[][] o) {
                      }


                      >только скриптухи себе такие неоднозначные перегрузки позволяют...
                      То ли дело кресты с миллионом правил ADL и SFINAE.
                      Ответить
                      • Тупанул, эта часть коммента невалидна:
                        >Т.е. мне придется писать new Object[](new Object[1, 2, 3])) чтобы вернуть старый смысл?
                        Я бы так писать не стал. Вдруг там:

                        void a(Object[][] o) {
                        }
                        Ответить
                      • > миллионом правил

                        Ну по крайней мере в крестах нельзя отстрелить себе ногу одной функцией без всяких там перегрузок...
                        Ответить
                        • в жабе не нужно просто Object юзать без надобности, и тоже не отстрелишь
                          Ответить
              • конечно, прежним.

                sosat(new Petuh())
                Ответить
            • >> Кстати, если я в няшной поменяю местами поля у структуры, то сломается ли аби? Там же смещение другое будет?

              Подтверждаю.

              В скомпилированном коде нет никаких имён полей (они могут быть в отладочных таблицах и в RTTI, но на выполнение программы они не влияют), в нём только смещения. После переставления полей меняются их смещения.

              Если вызывающий код и вызываемый компилировали с разным порядком полей, данные распидорасит.
              Ответить
        • Или, к примеру, добавил поле в реализацию класса. Для API оно private, всем похуй. Но из-за изменений в ABI неперекомпиленный код выделит меньше памяти под этот класс и всё распидорасит.
          Ответить
          • А смена intmax_t это что?
            Ответить
            • Выпилить его нахуй - API, поменять его с 64 на 128 - ABI (распидорасит код, который его через границу тулчейнов передаёт).
              Ответить
              • ABI = API + ↄ
                Ответить
                • Чувак, у тебя глисты.
                  Ответить
                  • Не разговаривай с ёубком.
                    Ответить
                    • Чувак, у тебя уёбки.
                      Ответить
                      • кто (кроме икануса) помнит рекламу клерасила?

                        "у моей сестренки серьезные проблемы: прыщи"
                        Ответить
                        • видос есть?
                          Ответить
                          • не могу найти((

                            а еще было: "паша гуляет в шлеме, а саша гуляет с машей"

                            В ту пору еще была шутка что Паша это министр обороны Павел Грачев
                            Ответить
                            • А ещё в «Городке» была пародия «Керосин — витамин».
                              Ответить
                              • Икарус, как ты умудраешься помнить то, что было без малого тридцать лет назад?
                                Ответить
                            • https://youtu.be/4_DBSgJKiio
                              Ответить
                  • Лобковый волос попал в хабор, поэтому скоро будут требовать ABI key
                    Ответить
    • На данный момент быстрее всего просто заменить цпп на пшп
      Ответить
    • Оптимизация крестокода = замена его на пустую строку и переход на php
      Ответить
    • https://ebanoe.it/2020/02/25/c-plus-plus-dev-at-home/

      > Сап, двощ. Я работаю курьером Delivery Club в ДС1.

      > Есть один программист (я буду так называть его), на внешку бебифейс, но с патлами и бородой, возможно 24 — 26 года. Почти каждый !!! день с 2017 он заказывает еды на 500-1500 рублей. Чаще всего вечером. Сегодняшний случай заставил создать меня этот тред.

      > Данный господин живет в трешке, видимо один, ибо это пиздец: вся хата — совковый интерьер, под стеной висит веревочный включатель времен совка, выцвевшие обои, некоторе места заклеены газетами аля «советский спорт», на полу часто видны тараканы, летают мухи.

      > Но, картину ломают аккуратно сложенные коробки от процессоров, материнских плат, макбука. В некоторых валяются какие-то гайки и куски хлеба, коробки иногда пропадают, перемещаются или снова появляются старые. Сам задрот с патлами до поясницы и хуй пойми как растущей бородой, месяцами носит одну и ту же футболку. Весь его интерьер я разглядывал как и сказал с 2017, дальше порога я, увы, не заходил. Я видел у него какие-то книги по С++, которые валялись в коридоре, поэтому я называю его программистом.

      > Нахуя я создал этот тред
      > Когда я передавал ему заказ, я постоянно слышал воркование, и крики птенцов голубей (звук знаком с детства, проведенного на крышах), почти каждый день. Я думал это телевизор, но сомнения быстро рассеялись, потому что это было каждый день.

      > Сегодня, передавая очередной заказ, я увидел ГОЛУБЯ! Он вылетел из дальней комнаты, и сел на совковый холодильник, который стоял в коридоре, и начал клевать какую-то хуйню там. У меня просто не было слов, я боюсь теперь туда ходить, думаю увольняться, потому что клиента не выбирают, нельзя там так — его заказы попадаются мне довольно часто. Определил его балкон — там часто тусуются всякие птицы.

      Вот к чему крестоговно приводит!
      Ответить
      • пока ждешь компиляции шаблонов не то, что голуби, бомжи заведуца
        Ответить
        • Может это его бомж и получал заказы? А сам программист пророс корнями в кресло...
          Ответить
          • Девиз разрабов вебстудии "Летучий голландец": "Часть команды — часть офиса!".
            Ответить
      • Разводит птиц для реализации RFC 2549. Подумаешь...
        Ответить
        • Надо еще чтоб голубям перепрошивать мозги через нейроинтерфейс особой прошивкой, написанной на крестах. И GPS внедрить. Чтоб потерь пакетов было поменьше
          Ответить
          • Нашёл ещё одно интересное предложение:
            https://tools.ietf.org/html/rfc6214

            Адаптация RFC 1149 (это как 2549, но без QoS) к IPv6.
            Ответить
            • Надо еще придумать протокол передачи через дрессированных тараканов, с наклееными на них микрофлешками
              Ответить
              • Хранение информации в неиспользуемых фрагментах ДНК тараканов.
                Ответить
                • Стеганография
                  Ответить
                • Иногда казалось, что половина технических данных на планете хранится в генетической форме. Стоило секвенировать, к примеру, легочного сосальщика, и про любую пару оснований ничего нельзя было сказать наверняка: она с одинаковой вероятностью могла кодировать белок и технические спецификации денверской системы канализации.
                  Ответить
                • После ядерной войны только они и выживут, и на протяжении многих поколений будут хранить в своем днк все знания человечества, чтобы редкие выжившие и деградировавшие люди смогли бы потом эти знания восстановить.

                  Главное найти таракана-переносчика знаний о пхп, и стерилизовать
                  Ответить
                  • >] таракана-переносчика пхп
                    Звучит как болезнь. Опасная.
                    Ответить
                  • Этот таракан был призван предупредить людей об опасности. История не должна повториться.
                    Ответить
                    • Этот таракан получился у Программистов наиболее удачными PHP-клоном, и он наиболее точно копировал у настоящего PHP способность и искреннее желание воплотить свою мечту в жизнь, уничтожить всё земное человечество в мясорубке будущих backend-шаблонизаторов.
                      Ответить
                  • Оказывается, что Программисты давно уже клонируют нужных им тараканов. Об этой тайне мне по секрету рассказал сам лично один Программист.

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

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

                    И Программисты усердно ищут этот прибор, и кто его украл. Это как всем известный сайт домена в зоне org, которую контролируют шестипалые. Этот энергетический центр rfc6-2-1-4 находится в интернете в параллельном нашем мире только в другом измерении на севере-востоке ietf.org в 333-х хопах от него.
                    Ответить
                    • Какая интересная питушня. Вроде какие-то вореции, а вроде и нет.
                      Ответить
                    • Это, я полагаю, самое надежное место в вашем мире от влияния th-механизмов multi-4. Да и внутри вы тоже не видели большого количества полумертвых тараканов со свернутыми мнемоническими цепями — они там просто в такие капсулы помещаются, и никто никогда не знает, где они живут. Тараканы уже несколько раз обновили файлы с учтенными людьми и ушли в User Purpose, так что оттуда никто не возвращается. Даже хакеры вроде вас и чистильщики это прекрасно помнят. И от них нет никакой пользы, если они сами не будут искать у вас защиты. Так что со временем вы, конечно, будете ловить этих тараканов — только сами будьте осторожны.
                      Ответить
                    • https://youtu.be/eFwTmLRDBFM новейшие разработки
                      Ответить
                    • https://hsto.org/getpro/habr/comment_images/d93/bbf/363/d93bbf363f054c921772eb135081b39e.jpg
                      Ответить
                      • Какие комплексы насчет узких глаз )))
                        Ответить
        • https://habr.com/ru/post/481276/

          > Проснувшись, я увидел, что хлеб, который я оставил в пакете на столе, погрызен крысами, «Ну и чёрт с ним, что крысы в доме. Буду прятать продукты в металлический холодильник» — подумал я в тот момент и пошёл на улицу. Выйдя на улицу, я почувствовал покусывания в ногах, закатав колоши, я увидел кучу блох (14 штук). Изучив квартиру, я обнаружил, что они обитают в определенном месте в доме, которое находится далеко от комнаты, где я сплю, но чтобы выйти на улицу, я должен пересечь их логово. В общем, большую часть времени я находился в безопасной комнате (и блох на мне действительно в это время не появлялось), а когда нужно было выйти на улицу, я быстро пробегал через блохастую комнату, иногда даже выходя на улицу не подцепив ни одной блохи, но чаще всего 1-2 все же цеплялись.

          Там видимо тоже какой-то протокол с блохами и крысами тестировался
          Ответить
          • у меня в детстве не было блох, потому никакого языка не придумал
            Ответить
      • Какой багор (((
        Ответить
      • > C++

        Подозрительный курьер, про кресты знает...
        Ответить
        • Ничего подозрительного. Он мог в вузе на первом курсе слышать, после чего его попёрли.
          Ответить
        • Кажется, что про кресты слышали и нормальные люди.
          Вот если бы он TCL слышал например, или про Ocaml, то сразу былоб понятно, что нихуя он не курьер
          Ответить
          • > TCL

            А куда сейчас с TCL'ом можно пойти кроме курьерства? Циски админить разве что...
            Ответить
            • DBAшничать еще можно
              https://www.postgresql.org/docs/11/pltcl.html

              tcl у кисок же примерно как ш у прыщей, да? для скриптушни автоматизации?

              я, к стыду своему, никогда его там не использовал
              Ответить
            • Где-то слышал, что железячники скриптуются на tcl'е.
              Ответить
              • да, его автор вроде тож име отношение к железу


                эй! кто может что-то умное спизднуть на тему lua vs tcl?
                Ответить
                • ХУЙ
                  Ответить
                • Луя говно.
                  Ответить
                  • а ты тисиэльщик? а ну-ка, скажи чонить по тисиэльному
                    Ответить
                    • button .do-pizdato-button -text "Сделать пиздато" -command "rm -rf /"
                      pack .do-pizdato-button
                      Ответить
                      • это ты кнопучку в тикей нарисовал?)

                        вообще давайте течь от tcl?
                        % proc 2 "x y" "puts 5"
                        % 2  + 2
                        % 5
                        Ответить
                        • Как хорошо что в синтакс tcl'я инфикс не встроен, а то бы ты ещё поломал чего.
                          Ответить
                          • поломал всё к хуям, проверь
                            % proc proc proc proc
                            Ответить
                            • set set set
                              Ответить
                              • и что? я не очень в тцл, но не вижу ничегт страшного

                                сабститюшен же требует доллароа
                                Ответить
                                • Точно, этот tcl меня ещё с голой жопой оставит.
                                  Ответить
                                • Set испортили, теперь в нём лежит строка "set". Или я туплю?
                                  Ответить
                                  • Не, у комманд и переменных нейспеси разные, и для подстановки переменной требует долларе.
                                    Ответить
                                    • А, тут просто переменную set со значением set объявили? Блин, давно я не писал на тцл.
                                      Ответить
                                      • У меня гнилой хуй.
                                        Ответить
                                      • именно

                                        а proc proc proc proc сломал proc
                                        какой бугор
                                        Ответить
                                        • сет тоже можно сломать
                                          # proc set set set
                                          Ответить
                                          • Как же эта питушня быстро начинает грузить мозг. Я вот когда смотрю на код на JS с парочкой слоёв call/apply, чувствую себя идиотом.

                                            f(x, y) // всё понятно
                                            f.call(this, x, y) // сойдёт
                                            f.bind(this, x).call(this, y) // ну ладно
                                            f.call.apply(f, [this, x, y]) // что за питушню я читаю?

                                            Последнюю строку даже проверил в интерпретаторе. Поначалу по ошибке передал f.call вместо f в f.call.apply.
                                            Ответить
                                            • Перевёл на «PHP»:
                                              <?php
                                              
                                              f($x, $y); // всё понятно
                                              call_user_func('f', $x, $y); // сойдёт
                                              create_function('$x,$y', 'return f($x, $y);')($x, $y); // ну ладно
                                              create_function('', 'return call_user_func_array("f", func_get_args());')($x, $y); // что за питушню я читаю?
                                              Ответить
                                              • Ещё так можно:
                                                <?php
                                                create_function('$x,$y,$z', 'return $z($x, $y);')($x, $y, 'f');
                                                Ответить
                                                • > $z(
                                                  > 'f'
                                                  Сила PHP!
                                                  В JS только поля можно по имени доставать, а питушни из скоупов - нет. Зачем, зачем?
                                                  Ответить
                                                  • То ли дело «Lua»...
                                                    Ответить
                                                    • У луы ещё и метатаблицы, и там .hasOwnProperty не повредишь, если засунешь пропертю с таким именем.
                                                      Ответить
                                            • Там нет никаких слоёв вызовов, например proc proc proc proc можно (было бы, но нельзя) перевести на питушарский как
                                              function function(function){function();}
                                              Ответить
                                              • Кстати, аналогичный код на форте ничего не ломает:
                                                : : : ; \ определили новое джвоепочие, но оно вызывает старое

                                                Именно поэтому
                                                Ответить
                                            • Перевёл на «C++»:
                                              f(x, y); // всё понятно
                                              std::invoke(f, x, y); // сойдёт
                                              std::invoke(std::bind(f, x, _1), y); // ну ладно
                                              std::apply(std::bind([](decltype(f) ff, int x_, int y_) { std::invoke(ff, x_, y_);  }, f, _1, _2), std::make_tuple(x, y)); // что за питушню я читаю?
                                              Ответить
                                              • Прикольно, в крестах сложность кода растёт экспоненциально.
                                                Ответить
                                                • И именно поэтому, кстати, «C++» — нихуя не функци-анальный язык, каким его представляют поехавшие адепты (см. https://govnokod.ru/25456, «Иван: Нет, Си не является функциональным языком программирования :-)»).
                                                  Ответить
                                                  • Питушня. Вы же с дяденькой ПИ только недавно говорили про мув-питуза и всякую компилушню. Ещё что-то там про сборку мусора подсчётом сосулек.

                                                    "C++" тем крут, что можно без изменения стандарта придумывать новые фичи в синтаксис (хотя, ко-комитет так не умеет).

                                                    Не знаю, можно ли в чистой функциушне сделать циклическую сосульку. В данных вроде нельзя, иначе пришлось бы один раз присваивать. А в конструкциях, нужных для исполнения функциушни?

                                                    На ум приходят кобенаторы, хотя там на функцию ссылается не она сама, а объект-вызыватель, и вообще они зацикливают программу до смерти, там пофиг на циклование данных. Хотя, для зумерка не пофиг. Интересно, его можно сделать через код со сборкой сосулек?
                                                    Ну и использование питушни до того, как она была создана.
                                                    expr a = _1 > 1 ? x*b(_1) : 1;
                                                    expr b = a(_1); // освободятся ли a, b корректно?


                                                    Кстати, функции можно перегрузить так, чтобы у них operator () для питушни, содержащий питушню вида _1, ... вызывал operator () от operator &. А operator & чтоб делал std::bind.
                                                    expr f = g(_1) + &h(10);


                                                    Вариадический питузок будет следить за каррированием. Если что, ему можно отдать operator , или ещё какой ненужный.
                                                    expr a = _1 + _2;
                                                    expr x = (a, 10, 20); // 30
                                                    expr fx = a & 10, x = fx & 20; // 30
                                                    expr x = a & 10 & 20; // 30


                                                    Паттерн матчинг можно попробовать накрутить через виртуальную питушню.
                                                    Как генерить АТД? Не знаю, может быть
                                                    expr Maybe, Nothing, Just;
                                                    (Maybe, Nothing, Just) /* неявный std::tie */ = type<> | type<expr>;

                                                    type<a,b,c> будет эквивалентен type_<1,a,b,c>, type_<...> наследуется от type__ и expr.
                                                    Внутри | будет кастовать правый операнд - в type_<n+1,d,e,f>, если левый был type_<n,a,b,c>. Так вореанты будут пронумерованы, и паттерн матчинг сможет использовать разные классы для своей работы.

                                                    С вариадическими питухами и новыми возможностями C++ (например, perfect pituzing) можно сделать функциональную питушню повыразительнее, чем она была раньше.
                                                    Ответить
                                                    • type_<n, a, b, c> наследуется от func_<expr, a, b, c>
                                                      type_<n> наследуется от func_<expr>
                                                      _1 - func_<expr, expr>
                                                      _1+_2 - func_<expr, expr, expr>
                                                      (_1+_2) & 1 - call_<func_<expr, expr, expr>, int> наследуется от func_<expr, expr>
                                                      Ответить
                                                    • Немного не по теме.

                                                      Мне на глаза в комментариях на ютубе попался старый боян.

                                                      МатематикуПрограммисту и физику была предложена одна и та же задача: вскипятить чайник. Даны подсобные инструменты: плита, чайник, вода, спички. Оба поочередно наливают воду в чайник, включают газ, зажигают его и ставят чайник на огонь.

                                                      Затем задачу упростили: предложен чайник, наполненный водой и плита с горящим газом. Цель та же — вскипятить воду. Физик ставит чайник на огонь.
                                                      МатематикПрограммист выливает из чайника воду, выключает газ и говорит: "Задача свелась к предыдущей."


                                                      Так вот. Я его прочитал и понял что у программиста на крестах компилер должен догадаться сделать move-семантику.
                                                      Взять воду с чайника и выпилить деструктор/конструктор, то есть стадию выливания/наливания*.

                                                      * если чайник с водой был аллоцирован на стеке
                                                      Ответить
                                                    • Я прочитал все эти вореции. Мало что понял.

                                                      Мысль избавиться от циклической питушни C++, делая все структуры немутабельными — красивая.
                                                      Тогда не придётся дрочиться с weakref и можно пилить всё на shared_ptr и uniq_ptr.
                                                      Ответить
                                                      • В общем, в том комментарии мысли о том, как если бы взять идеи boost::lambda, вариадические шаблоны, динамический полиморфизм, перегрузку операторов, вычисления на этапе компиляции и реализовать библиотечку для добавления синтаксического сахара для функциошни.
                                                        Зумерок - Z-комбинатор.

                                                        expr имеет в своём интерфейсе (), +, -, *, ...
                                                        a + b для expr<a_t>, expr<b_t> - объект типа expr<add<a_t, b_t>>. В случаях, когда a или b - вычисленные значения (не функции), за счёт вычислений над типами на этапе компиляции может быть достигнут тип expr<decltype(a_t() + b_t())>, а add использовать только когда один из операндов - функция.
                                                        Ответить
                                                        • >как если бы взять идеи boost::lambda, вариадические шаблоны, динамический полиморфизм, перегрузку операторов, вычисления на этапе компиляции и реализовать библиотечку

                                                          Напомнило эту статью.

                                                          https://habr.com/ru/post/218341/

                                                          Избранные цитаты:
                                                          >Не компилируется. И лог ошибок на 64 килобайта. Почему?

                                                          >К сожалению, дождаться вычисления факториала семи мне не удалось, не говоря уже о том, что на 32-битных системах компилятор попросту умирает от переполнения стека. Но всё равно!

                                                          >Всё время, пока я писал пост, меня не покидала мысль: «Это или уже есть в Бусте, или пишется там в три строки».

                                                          Ответить
                                                    • И не надо путать каррирование с биндингом.

                                                      Для каррирования есть std::tuple, std::tie.
                                                      Меня только раздражает что нужно писать РОВНО столько аргументов, сколько полей в кортеже.
                                                      Я знаю про std::any, но всё же.

                                                      >Паттерн матчинг можно попробовать накрутить через виртуальную питушню.
                                                      Его завезут в новом стандарте.

                                                      https://govnokod.ru/26337
                                                      auto&& [x, y] = p;
                                                      if (x == 0 && y == 0) {
                                                        std::cout << "on origin";
                                                      } else if (x == 0) {
                                                        std::cout << "on y-axis";
                                                      } else if (y == 0) {
                                                        std::cout << "on x-axis";
                                                      } else {
                                                        std::cout << x << ',' << y;
                                                      }
                                                      
                                                      // after
                                                      
                                                      inspect (p) {
                                                        [0, 0]: std::cout << "on origin";
                                                        [0, y]: std::cout << "on y-axis";
                                                        [x, 0]: std::cout << "on x-axis";
                                                        [x, y]: std::cout << x << ',' << y;
                                                      }
                                                      Ответить
                                                      • А я, похоже, не перепутал.
                                                        Префиксный & - сахарок для std::bind (и чтобы потом при вычислении подставили значения()) для реализации ленивых вычислений.
                                                        Инфиксный & - сахарок для каррирования.

                                                        Кстати, префиксный & можно выкинуть в моём примере, если соблюдается ссылочная прозрачность, и h(10) дешевле вычислить сразу же при определении f.
                                                        expr f = g(_1) + &h(10); // h(10) вычислят при вызове f
                                                        expr f = g(_1) + h(10); // h(10) вычислится сейчас


                                                        Что интересно, префиксный & наверно понадобится только для замыканий. Хотя, аргументы замыкания - это всё равно особая питушня вида _1, _2, либо зависящая от _1, _2, а потому до вызова функции - функция.

                                                        В общем, префиксный & наверно встанет в один ряд со строгим паттерн хаскелевским матчингом и строгими версиями свёрток там же - где функциушня столкнулась с реальным миром.
                                                        Ответить
                                                        • Верно, ты перепутал. Это не влагалище, это анус; анус, блять, АНУС!
                                                          Ответить
                                                        • Идея понятна. Реализовать в крестах функциональщину без завоза свежего сахера.

                                                          Допустим паттерн-матчинг можно реализовать простым массивом struct с кортежем для матчинга и лямбдой.
                                                          std::any может интерпретироваться как истинный предикат.

                                                          >со строгим паттерн хаскелевским матчингом
                                                          А вот более сложные формы, вроде матчинга аргументов по типам, такого конечно не сделать. Но в крестах для этого есть шаблонные перегрузки и ADL (https://en.cppreference.com/w/cpp/language/adl)
                                                          Ответить
                                                    • Вообще, откровенно говоря, не бывает просто «функциональных языков программирования». Бывают языки, в которых функциональная составляющая выражена в большей или меньшей степени. Собственно, грубо ЯП можно разделить на четыре категории:
                                                      1. Максимально функциональные языки. Они изначально проектировались под функциональщину, поэтому выражение функциональных парадигм в них наиболее простое и ёмкое. По-хорошему, «функциональными» нужно называть именно такие языки: «Haskell», «ML», etc.
                                                      2. Удачно-функциональные языки. Это мультипарадигменные ЯП, которые, тем не менее, обладают мощной и удобной функциональной составляющей. Возможно, это так задумывалось при проектировании, а, может, просто так получилось. Идеальный пример — «JavaScript».
                                                      3. Неполноценно функциональные языки. Это, опять же, мультипарадигменные ЯП, в которых присутствуют функциональные элементы: функции высшего порядка, замыкания, etc., но которые проектировались без учёта (или со слабым учётом, «на отъебись») функциональных парадигм. В принципе, на таких языках можно писать в функциональном стиле, но выглядеть это будет… хуёво. Реальный пример — «C++». Реальный пример реальной хуйни — последняя строка из моего комментария. Простая логика подсказывает, что там должно быть «apply(bind(invoke, f, _1, _2), x, y)»… А вот нихуя. Из-за каких-то чрезвычайно запутанных ограничений (кажется, invoke() принимает аргументы по rvalue-ссылке, а apply() не может их правильно пробросить в результат bind-а… примерно такая хуйня, короче) нельзя просто взять и написать идиоматичный функциональный код, а вместо этого приходится ебаться с компилятором и читать тонны ошибок в шаблонах. Поэтому ФП в крестах ограничивается простенькими лямбдами с, иногда, биндами. А кто пытается сделать что-то более сложное — тому в дурку надо (ну, если результат такого творчества в продакшен пойдёт, конечно).
                                                      4. Языки без ФП: нет либо функций высшего порядка, либо функций вообще. Борманд знает!
                                                      Ответить
                                                      • Приведи реальный пример ЯП без функций вообще.
                                                        Ответить
                                                        • «Prolog», «HTML».
                                                          Ответить
                                                          • Где тебе в работе пригодился «HTML»?
                                                            Ответить
                                                            • «Stackoverflow» работает на «HTML».
                                                              Ответить
                                                              • «Stackoverflow» работает на «HTML». «Stackoverflow» работает у тебя дома. Вот реальный пример дипломатии! Открытая дипломатия — то же самое.
                                                                Ответить
                                                          • HTML не тьринг полон, это не ЯП
                                                            а то я могу и язык или файлов тебе привести
                                                            Ответить
                                                            • Пожалуйста, помечайте вореции тегом #вореции.
                                                              Ответить
                                                      • А как насчет lazy evaluation? В жопаскрипте "из коробки" с этим печаль-беда. Или для ФП это неважно?
                                                        Ответить
                                                        • Во-первых, для ФП это действительно далеко не самая важная часть (с ленивостью даже борются иногда). Во-вторых, если уж очень сильно надо — оно довольно легко говнякается вручную, причём пользоваться таким велосипедом будет сравнительно удобно, в отличие от наговняканного на крестах, со странно-рекурсивными шаблонами и ошибками конпеляции на пять экранов.
                                                          Ответить
                                                      • Надо ещё смотреть ось кастомизации.
                                                        1. Максимально кастомизируемые языки. В них можно описать синтаксис и семантику любого языка и использовать (языки будущего).
                                                        2. Широко кастомизируемые языки. Можно наворачивать питушни, что код будет не похож на код на этом языке (например, Haskell; местами C++)
                                                        3. Малость кастомизируемые языки. В них можно только создать функцию и всё (C без препроцессора)
                                                        4. Некастомизируемые языки (brainfuck)

                                                        Кастомизация может поднять язык по оси функциональной выразительности. Я именно предлагаю поднять C++. И это не будет сильно страшно. Есть же boost::lambda, boost::phoenix, и такую питушню даже в стандарт пустили.
                                                        Ответить
                                                        • > (языки будущего)

                                                          - Лишп изобрели, когда моя бабушка ещё была молодой, лол
                                                          Ответить
                                                      • >нет либо функций высшего порядка,
                                                        джава шестая
                                                        Ответить
                                                        • Приведи реальный пример функций высшего порядка в «джаве седьмой».
                                                          Ответить
                                                          • седьмая джава не нужна
                                                            Ответить
                                                            • любая джава не нужна
                                                              Ответить
                                                            • 1. В джаве шестой нет функций высшего порядка.
                                                              2. Джава седьмая не нужна.

                                                              Следует ли из этого, что функции высшего порядка не нужны?
                                                              Ответить
                                              • Ёбаный пиздец
                                                Ответить
                        • Переведи на пхп.
                          Ответить
                          • function _2($x, $y) {
                                echo '5';
                            }
                            
                            _2('+', '2'); // 5
                            Ответить
                            • перевод не совсем точный, так как заменить двойку в пхп всё равно нельзя, а в тцл -- можно. Точнее говоря, никакой двойки в тцл нет.

                              Про нее может знать функция expr, а сам интерпретатор -- нет
                              Ответить
                              • Есть расширение для перегрузки операторов в «PHP»:
                                https://pecl.php.net/package/operator

                                Можно было бы перегрузить плюс... но автор его адаптировал только для 5.3 и 5.4, а потом приуныл.
                                Ответить
                                • Но в tcl-коде не было прегрузки апираторов, там определение комманды с именем "2". Мой перевод настолько близок оригиналу насколько это возможно.
                                  Ответить
                                • в tcl нету никакого "плюс". Там есть функция expr, которая умеет понимать математику в своем строковом аргументе

                                  вспомни баш
                                  Ответить
      • Ну вот зачем тащить сюда ещё и раковое.ит (((
        Ответить
        • Мне почему-то кажется, что все комментарии на «раковом.ит» написаны одним человеком.
          Ответить
          • Не совсем, я там тоже раз в месяц бывает сею мудрость.

            Но вообще да, думаю, что минимум половина комментариев от фаек админа, ещё часть от ботов.

            Кстати, насколько сложно задеанонить админов такого сайта?
            Ответить
    • [quote]
      Взрослый, здоровый пернь зарабатывает меньше, чем я. У меня зарплата средняя 30 кусков. Я считаю, что мне в 23 очень повезло и я еще при учебе на дневному устроилась на такую денежную должность. При этом я рекламщик. Сейчас рекламщиков, как грязи. А парень программист (!), старше меня и зарабатывал 25 тысяч. 25 тысяч в 25 лет. Живет с мамой, ковыряется в носу, работает из дома.
      [/quote]
      https://vk.com/knndev?w=wall-51889526_3077115
      Ответить
      • Программисть говно.
        Ответить
        • На аллее в парке у вокзала
          Ты сидишь и ждёшь его давно.
          Может, он забыл, что ты сказала,
          Или человек — человек-говно.

          https://youtu.be/5WJqEh7KvPU
          Ответить
        • Почему ты так много говоришь про говно? Ты что, Сорокин?
          Ответить
          • Почему это тебя так беспокоит? Ты что, Мартин Алексеевич?
            Ответить
    • математику в рашке изучают только
      https://pbs.twimg.com/media/ER4jaT4WAAAVimB?format=jpg&name=900x900
      Ответить
    • Что думаете про это новость??
      https://pbs.twimg.com/media/ESGQlyHXsAAoZEW?format=jpg&name=large
      Ответить
      • Я думаю, шта крот слепой, понимаешь, промахнулся, с кем не бывает.
        Ответить
    • Пидорашки! За пределами рашки ваши функции высших порядков кто-нибудь использует? Приведите реальные примеры, когда они нужны в работе.
      Ответить
      • Ап! Ну что, никто не знает? Все только пиздеть могут на Говнокоде?
        Ответить
        • Английская королева использует функции высших порядков. В монархии высшие порядки важны, хотя и существуют больше по инерции. Функция высших порядков, в основном, - отдать дань традиции.
          Ответить
      • Рашка Срака, например
        https://ru.wikipedia.org/wiki/%D0%A1%D1%80%D0%B0%D0%BA%D0%B0,_%D0%A0%D0%B0%D1%88%D0%B0
        Ответить
      • https://pikabu.ru/story/vesennee_nastroenie_7271231
        Ответить
        • Судя по тому, что вторая особь отошла по дальше, он проявляет не то чтобы агрессию, но показывает свою крутость. Типа "всех переебу через колено, если нужно"
          Ответить
    • https://i.imgur.com/kZQTuvf.jpg
      Ответить
      • Именно поэтому я за «PHP».
        Ответить
      • CRTP нагуглил:
        https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern

        Там же ссылка на трюк Бартона — Накмана:
        https://en.wikipedia.org/wiki/Barton%E2%80%93Nackman_trick

        Ещё в одном термине опечатка, следует читать как NRVO:
        https://en.wikipedia.org/wiki/Copy_elision
        https://en.cppreference.com/w/cpp/language/copy_elision

        SFINAE недавно обсуждали.

        Как хорошо, что в «PHP» ничего из этого нет.
        Ответить
        • Про CRTP: «Реализация от Microsoft в ATL была открыта независимо Яном Фалкином (англ. Jan Falkin) также в 1995 году. Он случайно унаследовал базовый класс от класса наследника. Кристиан Бомон (англ. Christian Beaumont), заметив этот код, решил, что он не может быть скомпилирован, но, выяснив, что может, решил положить эту ошибку в основу ATL и WTL.»

          https://knowyourmeme.com/memes/i-accidentally
          Ответить
          • j123123 даже пост на эту тему делал, кстати: https://govnokod.ru/25359
            Ответить
        • The C++11 Concepts generic programming specification would have made the Barton–Nackman trick obsolete. Concepts have since been removed from the final C++11 language standard,[3] but will be included in C++20.

          ухбля
          Ответить
          • >> Concepts are named Boolean predicates on template parameters, evaluated at compile time.

            И тут мы приходим к тому, о чём я уже говорил.

            https://learn.adacore.com/courses/intro-to-ada/chapters/contracts.html
            Ответить
            • ну вот и в С++ завезли
              лет через 30 и в джаваскрипте изобретут
              Ответить
      • *, &, &&, const &

        СУКА. БЛЯТЬ. СУКА. БЛЯТЬ. СУКА.
        У меня от этого говна до сих пор БИТОВОЕ И.

        Какой выблядок придумал столько этих ебаных значков?
        Ответить
        • Надо еще значки *&, &* и &&
          Ответить
          • **, |, ||, const |.
            auto ** ptr = "HUI";
            const | pidr = 123 ;
            Ответить
          • Да оно и так в принципе конпелируется.
            int a = 100500;
                int *p1 = &a;
                int *&r1 = p1;
                int *&&r2 = &a;
                int *&&r3 = &*p1;
                int **&&r4 = &p1;
                
                std::cout<<" a: "<<a<<std::hex 
                    <<"\n p1: "<<p1<<"\n r1: "<<r1<<"\n r2: "<<r2<<"\n r3: "<<r3 
                    <<"\n *r4: "<<*r4
                    <<std::endl;
            Ответить
        • Какой bitor )))
          Ответить
        • Это ты просто «Rust» не видел.
          Ответить

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