1. Куча / Говнокод #27646

    0

    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
    pub fn take(end: u32) -> u32 
    {
        (0..).step_by(1000000000)
            .map(|i| i * i)
            .take_while(|&i| i < end)
            .sum()
    }
    pub fn filter(end: u32) -> u32 
    {
        (0..).step_by(1000000000)
            .map(|i| i * i)
            .filter(|&i| i < end)
            .sum()
    }

    Решил вернуться к изучению багра rust.
    Суть такова: код с take_while выводит 0, код с filter падает с runtime error или выбрасывается rustClang как бесконечный цикл (зависит от версии).

    https://ideone.com/IS05Q0

    То есть код filter ма-те-ма-ти-че-ски эквивалентен take_while. Поскольку i² монотонно возрастающая функция.

    Из примера ниже можно убедиться что цикл на самом деле конечен.
    https://ideone.com/xC2r35
    Счётчик кидает ошибку при переполнении и range не зацикливается.

    for x in (1..).step_by(1000000000) {
    println!("{}", x);
    }

    1
    1000000001
    2000000001
    Runtime error #stdin #stdout #stderr 0.01s 5552KB

    Запостил: 3.14159265, 05 Сентября 2021

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

    • Начало обсуждения (в том треде 1377 комментов и он засран баграми).
      https://govnokod.ru/27581#comment658921

      3.14159265
      Но ведь этот код не похож на цикл без сайд-эффектов.
      Почему шланг его зацикливал?

      bormand
      > Но ведь этот код не похож на цикл без сайд-эффектов.

      Значит в него всего-навсего прокрался UB ;)

      Хотя я не вижу тут никаких проблем на глаз, даже в крестах u32 без UB'ов.

      > сайд-эффектов

      А где они, кстати?

      3.14159265
      Я тоже долго думал и не мог понять.
      while (true) есть, внешних сайд-эффектов тоже нет. Но это же полезный расчёт.

      Автор говорит что нужно вместо .filter(|&i| i < end) писать .take_while(|&i| i < end). Тогда всё хорошо.

      Но если компилятор/язык действительно ма-тем-ати-чны, то он должен понять что i, а вслед за ним i² монотонно возрастающая функция.

      И как только найдётся i, который превысит end, то последующие i<end никогда не будет истинным. Это следует из принципа математической индукции.

      Соответственно filter в данном случае эквивалентен take_while.

      bormand
      > Соответственно filter в данном случае эквивалентен take_while.

      Нет! У нас же тут не натуральные числа, а кольцо (или как там его в математике) u32.

      i бегает по кругу, а filter в отличие от take_while не является условием остановки.
      Ответить
    • Более того, гиптiме еггог выдаёт даже такая конструкция
      pub fn filter(end: u32) -> u32 {
          (0..)
              .filter(|&i| false)
              .sum()
      }
      Ответить
      • https://ideone.com/vfKwe4
        
        main = print (sum(filter ( \n -> False ) [1..] ))
        Тьфу, говно. И не постеснялись же назвать язык в честь математика.
        Ответить
        • Кстати
          en.wikipedia.org/wiki/Empty_sum
          Вот отучился я 11 лет в школе и 6 лет на физическом факультете, а о таких простых вещах не задумывался.
          Можно ли считать говнокод, который наводит на мысли, хорошим?
          Ответить
          • > не задумывался

            А на ГК это вроде обсуждалось. Именно поэтому я за ГК.
            Ответить
          • empty sum ещё можно принять за 0, вроде ничего не ломает. А вот в empty max что вернуть?
            Ответить
            • А в empty prod достаточно положить единицу?
              Ответить
              • Вроде же у всех местных был матан или что-то вроде того, где рассказывали про кольца и поля. Даже если всё остальное было непонятной питушнёй, нейтральные элементы для (+) и (*) должны были запомниться.

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

                  Это не матан, а абстрактная алгебра. Её физикам из рашки дают максимально херово. По сути, вместо неё есть курсы по теории групп и представлений групп, а остальное фи-зи-кам знать якобы нецелесообразно. Идиотская практика, это как строить крышу без фундамента.
                  Ответить
                  • Нам математическую статистику преподавал сотрудник «стекловки» (Математического института РАН). Он начинал со множеств, с меры, с топологии, с сигма-алгебры и дошёл до функционалов. В итоге бо́льшая часть группы ничего не поняла.

                    «Сложи n чисел и подели на их количество» гораздо понятнее, чем заумь про интегралы Лебега на хитрожопых множествах.
                    Ответить
                  • > Идиотская практика, это как строить крышу без фундамента.

                    А если где-то будет неидиотская практика, то набегут сёмы и скажут, что вуз не учит работать, а готовит ма-те-ма-ти-ков.
                    Ответить
                    • Сёмам просто вместо ВУЗов нужно идти сразу на skillbox, на курсы "джава программист за четыре недели"
                      Ответить
                    • CHayT просто тянет одеяло на себя как эксперт в математике.
                      Экспертам кажется, что его области почти не учат, и наступило бы всеобщее благо, если бы эту область рассказывали от самого начала включая муки её основателя и историю его семьи, иначе к преподаванию области даже не надо приступать.

                      новости по теме: ШОК! программисты хотят, чтобы обучение начинали с сишки, ассемблера или вовсе абака.
                      Ответить
                      • Я вообще не эксперт в математике. Я просто помню недоумение, который у меня вызывали групповые законы до того, как мне стало известно про остальную иерархию.
                        Ответить
                        • Тогда может быть нафиг выкинуть эти группы, если они всё равно вызывают недоумение, а для полного понимания требуют кучу питушни, которая точно не пригодится?

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

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

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

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

                    И так со множеством других предметов. Когда начинается реальное применение, все уже забыли изученное. Какой багор )))
                    Ответить
                    • Именно потому я за ``презерватив-на-глобус``: сначала студентов нужно заинтересовать, показать реальное применение, а потом давать сложную теорию
                      Ответить
                      • У нас в этом плане была проблема с квантовой механикой. Опытный старшекурсник нам так и сказал: "а в следующем семестре вы начнёте узнавать, зачем вам всё это надо"
                        Ответить
                      • Или даже так: показать реальную задачу, показать простое, но неправильное решение, грамотно разъебать его, и тем самым мотивировать людей на изучение сложной теории. Пройти исторический путь науки за 10 минут, так сказать.
                        Ответить
                        • «А сегодня, дети, мы будем изучать, почему Ньютон был анскильным питухом, и почему вся его механика — хуйня.»
                          Ответить
                          • И почему? Что, никто не знает?
                            Ответить
                          • > Ньютон
                            Какой-то дохлый белёсый расист.
                            Именно поэтому надо учить эбонику.
                            Ответить
                          • > «А сегодня, дети, мы будем изучать, почему Ньютон был анскильным питухом, и почему вся его механика — хуйня.»

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

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

                      Нам всё давали с выводом, откуда это берётся. Но мы для остальных потоков были белыми воронами, потому что всяким технологам и экономистам просто кидали готовые формулы за щеку. Экономисты даже решение уравнения dy/dx = ky вызубривали, для них разделение переменных и интегрирование было «лишней подробностью».

                      С другой стороны, нам не давали ТММ, например, и другие практические дисциплины.

                      Итого получается, что вузы даже не пытаются сократить разрыв между «теоретиками» и «практиками»: выпускают «практиков», выучивших математические формулы как закон божий, и «теоретиков», которые думают, что булки на дереве растут.
                      Ответить
                      • > с выводом, откуда это берётся.
                        И сказал бог математики: пользуясь формулой (111) и теоремой 4.2 я вывел такой икс, который вознёсся до небес и накрыл собою всю область определения. Домножив уравнение (15) на бесконечность (семёрку), я получил эту новую формулу!

                        Мне в школе, где начались доказательства в геометрии, а затем в вузе, где начались доказательства любой питушни, от этого не стало легче.

                        > с выводом, откуда это берётся.
                        А надо рассказывать с выводом, зачем это берётся.
                        Ответить
                      • > Нам всё давали с выводом, откуда это берётся.

                        Вам аксиоматику матанализа давали? Ну например, на какие аксиомы надо опираться, чтобы доказать правило Лопиталя?
                        Аксиомы Пеано вам рассказывали? А какие аксиомы должны быть для описания вещественных чисел? А для комплексных?
                        Ответить
                  • Не знаю, кто решал, что нам знать целесообразно.
                    Например, если говорить о фундаменте, у нас было определение вещественного числа как класса эквивалентности сходящихся последовательностей рациональных чисел по отношению сходимости поэлементной разности последовательностей к 0. Ну или мне это приснилось :D
                    До вышеупомянутого интеграла Лебега тоже доходили (зачем?)
                    Ответить
                • Я конкретно про пустую сумму. С нейтральными элементами у меня всё в порядке, и даже линейная алгебра и теория групп были.
                  Ответить
            • > А вот в empty max что вернуть?
              -∞

              Edit: на помощь спешит божественный JavaScript:
              Math.max()
              -Infinity
              Ответить
              • А питон упал ;(
                Ответить
                • Пыхтону простительно.
                  Но Haskell (названный в честь ма-те-ма-ти-ка и логика). На этот раз взят конечный список.
                  main = print (maximum (filter ( \n -> False ) [1..2] ))
                  Runtime error	#stdin #stdout #stderr 0s 5500KB
                  Сразу видно, какой язык сделали пирдолики-теоретики, а какой — практики-профессионалы.
                  Ответить
                  • > filter ( \n -> False )
                    Зачем этот фильтр тут?

                    Так смешиваются джве проблемы
                    1. Анскильность компилятора, который не смог доказать filter (const False) === []
                    2. Анскильность некоторых функций, которые не терпят пустого списка

                    В примере про sum сработало (1), в примере про maximum - (2).
                    Ответить
                  • Что важно, maximum ([]::[Double]) тоже вызывает багор.

                    Поясню. Без указания типа будет абстрактное число.
                    maximum (filter ( \n -> False ) [1..2] ) :: (Ord a, Num a, Enum a) => a

                    И в этом проблема: абстрактным числом может оказаться, скажем, Integer, у которого нет бесконечности, а значит Num a должно багровать на maximum [].

                    А вот если подставить список Double, то уже будет Double, где есть бесконечность
                    maximum (filter ( \n -> False ) [1..2]::[Double] ) :: Double


                    Кто такой этот максимум? Кусок реализации Foldable
                    :i maximum
                    type Foldable :: (* -> *) -> Constraint
                    class Foldable t where
                      ...
                      maximum :: Ord a => t a -> a
                      ...
                            -- Defined in `Data.Foldable'

                    Какой багор, Foldable берёт только однопараметрический тип, т.к. [] подойдёт, а [Double] - уже нет. Возможность реализовать нормальный максимум сломали, когда сделали Foldable.
                    Ответить
                    • Пиздец.

                      > И в этом проблема: абстрактным числом может оказаться, скажем, Integer, у которого нет бесконечности, а значит Num a должно багровать на maximum [].

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

                      Итог печальный: в «JS» реально используемом функциональном языке для практиков выдаётся верный результат.

                      А в теоретической заедушне: Runtime Error и Foldable bagor.
                      Ответить
                • А в «PHP» функция max ожидает не менее одного аргумента. На пустом списке не работает.

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

                  Хотя погодите, есть же max от массива. Скармливаем пустой:
                  https://ideone.com/x2lPty

                  Возвращает false. Именно поэтому я за «PHP».
                  Ответить
          • Надо было идти на физфак преподавать сишку. Там явно бы проходили массивы и рано или поздно встретилась бы задача про сумму элементов. Какой-нибудь шарящий студент бы показал, как его решение работает и на 5, и на 1, и на 0 элементах.
            Ответить
            • И на -1, если взял знаковый инт и проверить забыл...
              Ответить
              • Именно поэтому я за for (int i=0; i<len; i++). Отлично работает для отрицательных.
                Ответить
                • > Надо было идти на физфак преподавать сишку.
                  > Там явно бы проходили массивы и рано или поздно встретилась бы задача про сумму элементов.

                  Да. Пришёл бы какой-то «кегдан» «троллить препода» хацкилом.

                  А ему преподаватель и отвечает по-отечески: «Иди подучи матчасть, питух. Ты животное перед тем как кукарекать, почитай про еmpty sum. Чему тебя учить, питушок? Кукарекать начал ты, причем зафейлился в очередной раз.»

                  И привычно сольёт хаскель-отребье Сишным for (int i=0; i<len; i++)
                  Ответить
                  • Prelude> sum []
                    0
                    Ответить
                    • А теперь пужулуйста maximum.
                      Ответить
                      • maximum из Prelude — обобщённый, и работает и для чисел и для строк и для чорта лысого, реализующего общий порядок, a.k.a Ord. Ord не требует наличия минимального элемента, поэтому в общем случае maximum для пустого списка не определён.
                        Запили maximumFloat, который будет работать так же как JS и радуйся.

                        Либо отнаследуйся от Ord, и сделай тайпкласс ``Ord c минимальным и максимальным элементом'', для него можно будет запилить подобную питушню обобщённо. Просто никому нахер это не надо.

                        P.S. мартышка и очки Пи и Haskell.
                        Ответить
                        • P.S. Чтобы понять, почему божественный haskell даёт прикурить анскиллябрам, подумай о том, что у строк тоже есть тотальный порядок (лексикографический). Что должна возвращать minimum ([] :: [String])?
                          Ответить
                          • NaN
                            Ответить
                            • Кстати, да. Специальное значение, искусственно объявленное максимальной строкой.
                              Ответить
                          • пустую строку?
                            Ответить
                            • Не maximum, а mimimum, попрошу.
                              Ответить
                              • Бесконечную строку из максимальных символов.
                                Ответить
                                • А почему зелёным?

                                  Только что хотел написать тоже самое: ленивую функцию, которая вернёт бесконечную строку максимальных чаров (аналог числа -1).
                                  Ответить
                                  • max_str = (maxBound :: Char) : max_str
                                    min_str = [] :: String
                                    Ответить
                                  • Вот видишь, в haskell даже такую задачу можно решить правильно. А JS, где нет ленивости, как быть?
                                    Ответить
                                    • >А JS, где нет ленивости,
                                      а как же елда с генератором?
                                      Ответить
                                      • Елда с генератором — это уже не строка!
                                        Ответить
                                      • > елда с генератором

                                        А она пролезет в функцию, которая ожидает строку? Или плучится [Object object]?
                                        Ответить
                                        • > А она пролезет в функцию, которая ожидает строку?
                                          Это просто лживая, анскильная пропаганда чтобы очернить «JS» и компенсировать слив.

                                          Переопределил toString на объекте и готово.

                                          https://govnokod.ru/26408#comment524399
                                          Ответить
                                          • > Переопределил toString на объекте

                                            И чему равен toString бесконечной строки (нам ведь её с обычными строками ещё сравнивать)?
                                            Ответить
                                            • String.fromCodePoint(maxChar).repeat(window.Infinity)
                                              Ответить
                                              • > window.Infinity

                                                Какая протечка абстракций )))

                                                Открыл окно, достал бесконечность.
                                                Ответить
                                        • Смотря как она её ожидает.

                                          Если проверяет typeof, то не пролезет конечно
                                          Ответить
                                    • >haskell даже такую задачу можно решить правильно

                                      Можно. В абстрактной теории запарты. А в реальности: гиптiме еггог.

                                      На практике сначала это был аргумент для оправдания говнореализации maximum.

                                      Но потом ошибка хачкеля незаметно стала его преимуществом.
                                      Ответить
                                      • >запарты
                                        Крымскотатарский-русский словарь

                                        запарта: строгий выговор, строгач


                                        запарта чекмек — дать строгий выговор
                                        запарта емек — получить строгий выговор, схлопотать строгача
                                        Ответить
                            • Ну ок, максимум действительно может вернуть пустую строку не разрушив логику, а минимум?
                              Ответить
                        • Хорошо, не реализует нормально Ord.

                          Но почему тогда это говно, имея сверхстрогую путизацию от хеппи-миллера, компилируется и падает в рантайме?

                          Даже говняный rust не может собрать похожее (не знаю хорошо это или плохо)
                          let res = v.iter().max().unwrap();    
                          				^^^ the trait `std::cmp::Ord` is not implemented for `f64`
                          				
                          The trait core::cmp::Ord is not implemented for the type f32 and f64, so we cannot use the sort() method in std for sorting an Vec of floats. Do we need implement it by hand?

                          P.S: я вашу прелесть трогать не собирался. Начал смотреть UB дrustни.
                          Просто в процессе заметил что дrustуха всё украла из Хацкеля, и решил посмотреть как было в оригинале.
                          Ответить
                          • Какой трейт, какой unwrap, какой std::cmp? Сильно же ты ударился... На дворе 2010й год, пойдём залифтим чистую функцию в монаду.
                            Ответить
                            • > залифтим чистую функцию в монаду

                              Хаскелисту говоришь: у вас тут maximum функция неправильно работает. Компилируется и падает в рантайме.

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

                              Спор двух культур.
                              Ответить
                              • > В ответ получаешь заговаривание зубов: «разность градиента пандорической диворекци и кативной функции интерминальной суммы, полне стрелки ко-монады с категорического трансформера эндофункторого чистомата».

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

                                  > начали вещать про математику, и они её получили

                                  Как там квантор всеобщности и предикаты?

                                  https://govnokod.ru/27646#comment668795
                                  Ответить
                                  • Haskell — питьюринг-полный язык, в них в принципе никакого квантора общности быть не может. За ним тебе в Coq и подобные.
                                    Ответить
                                    • > За ним тебе в Coq и подобные.
                                      Именно поэтому я за «Coq» и против «Haskell».
                                      Ответить
                                      • > Именно поэтому я за «Coq»

                                        Там эту проблему вообще просто решили: есть максимум из списка натуралов (для пустого ноль), а минимум только из пары.
                                        Ответить
                                    • > Haskell — питьюринг-полный язык, в них в принципе никакого квантора общности быть не может

                                      На самом деле это слабый, чисто теоретический аргумент, применимо к оптимизации filter ( \n -> False ).

                                      Напоминает спор j123123 и ISO про то что constexpr-переменные тоже Тьюринг-полная питушня и в теории посчитать их невозможно. Однако на практике нормальная IDE вполне успешно выводит 99% случаев.

                                      C++ тоже Тьюринг полный язык, но тем не менее оптимизирует нафиг такие предикаты.

                                      А не обосирается и прячет свою анскильность за теоретушнёй и кучей зауми.
                                      Ответить
                                • Это как если бы в языке нельзя было сложить два числа, и математики начинали что-то там кукарекать, объясняя про невозможность сложения числа и вообще представления хотя бы иррационального питуха в компьютере.

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

                                  В Haskell за последние годы изменилось много чего, но никто даже не заметил, даже реальный код не сломался. В крестах бы давно все на говно извелись. А на хаскеле пара докторов переписали свои программы - и вся кодовая база перешла на новую версию.
                                  Ответить
                                  • Причём один из этих докторов - доктор Смегма
                                    Ответить
                                  • >В Haskell за последние годы изменилось много чего, но никто даже не заметил
                                    > даже реальный код не сломался.
                                    >>реальный код
                                    >>В Haskell

                                    Оксюморон.

                                    То чего нет — не ломается.

                                    Кстати именно из-за реального практического использования, в промышленных языках подобные corner case отлажены и нормально работают.
                                    Ответить
                          • Эм, в расте вообще нельзя сравнивать флоаты?

                            Из-за NaN'а поди?
                            Ответить
                            • > Эм, в расте вообще нельзя сравнивать флоаты?

                              Похоже да. Глубоко копаться в этом говне нет желания.

                              Там советы примерно как CHayTа: чтобы нормально сортировать массив флоатов, сделайте трейты, напишите ещё 200 строк кода.
                              Ответить
                        • >Либо отнаследуйся от Ord, и сделай тайпкласс ``Ord c минимальным и максимальным элементом'', для него можно будет запилить подобную питушню обобщённо.

                          Предлагается какая-то пирдоль вместо простого математически скилльного решения из коробки.

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

                            Просто хаскеллисты знают про разницу между порядком и решёткой.
                            Ответить
                            • С числами вроде как решили проблему. Никто не сказал "просто никому нахер не надо делить" и не оставил только Num с (+), (-) и (*). Сделали ещё несколько классов.
                              Ответить
                          • > Предлагается какая-то пирдоль

                            Эта пирдоль называется lattice в ма-те-матике*.

                            * Могу ошибаться в определениях по памяти
                            Ответить
    • Весь пост прямо гимн восхваления говнокода, велосипедостроения и стиля фигак фигак и в продакшн :)
      Ответить
      • Просто говно какое-то.

        Нам рекламируют это дерьмо как математические языки.

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

        Я хочу написать например ∀x ¬P(x)

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

        И что в итоге вышло? Всё что было заявлено — со всем обосрались.
        Ответить
        • > Я хочу написать например ∀x ¬P(x)

          guest 17.03.2016 17:02 # +6
          хороший язык
          люблю CLR и люблю функциональщину

          но у меня на клавиатуре нету ψ, и потому мне он не подойдет
          придется делать стартап на пхп
          Ответить
          • Дело форме не в записи.

            > .filter(|&i| false)
            > filter ( \n -> False )

            По сути означают то же.

            Если это говно не понимает элементарного, что после filter ( \n -> False ) у нас должно оставаться пустое множество. То какой от него толк?

            Это же не божественный gcc, который ASD_77 бодает в соседнем треде, а gcc ухмыляется и всё сводит к ret.

            Тут дали простейший пример на логику и говно опять обосралось.
            Ответить
    • > https://ideone.com/IS05Q0

      Ideone айсоско метит
      Ответить
    • А теперь возьмём язык для белых людей и посмотрим как там обстоят дела c кванторами и константыми предикатами.

      https://godbolt.org/z/bs7nbx1hP
      #include <iostream>
      #include <ranges>
      
      auto False = [](int i) { return false; };
      auto odd = [](int i) { return 1 == i % 2; };
      auto square = [](int i) { return i * i; };
      
      void none() {
      
          for (int i : std::views::iota(0, 10000000) 
                     | std::views::filter(False) 
                     | std::views::transform(square)) {
              printf("%d\n",i);
          }
      }
      
      none():
              ret

      А возьмём пару чётных:
      int main() {
      
          for (int i : std::views::iota(0, 7) 
                     | std::views::filter(odd) 
                     | std::views::transform(square)) {
              printf("%d\n",i);
          }
      }
      main:
              sub     rsp, 8
              mov     esi, 1
              mov     edi, OFFSET FLAT:.LC0
              xor     eax, eax
              call    printf
              mov     esi, 9
              mov     edi, OFFSET FLAT:.LC0
              xor     eax, eax
              call    printf
              mov     esi, 25
              mov     edi, OFFSET FLAT:.LC0
              xor     eax, eax
              call    printf
              xor     eax, eax
              add     rsp, 8
              ret
      Ответить
      • > для белых людей
        > iota
        Ответить
        • А что не так?

          Всё же отлично инлайнится и оптимизируется.

          std::views::filter(False) превращает цепочку в noop в отличие от Haskell и Rust.
          Ответить
      • #include <stdio.h>
        #include <stdlib.h>
        #include <stdbool.h>
        
        bool odd_(int i) { return 1 == i % 2; };
        int square_(int i) { return i * i; };
        
        int main()
        {
          for (int i=0; i < 7; i++)
          {
            if(odd_(i)) printf("%d\n",square_(i));
          }
          return EXIT_SUCCESS;
        }

        асм:
        main:
                sub     rsp, 8
                mov     esi, 1
                mov     edi, OFFSET FLAT:.LC0
                xor     eax, eax
                call    printf
                mov     esi, 9
                mov     edi, OFFSET FLAT:.LC0
                xor     eax, eax
                call    printf
                mov     esi, 25
                mov     edi, OFFSET FLAT:.LC0
                xor     eax, eax
                call    printf
                xor     eax, eax
                add     rsp, 8
                ret


        И нахуя этот "std::views" ? Опять говностандартизаторы хуйни понадобавляли
        Ответить
        • Круто. Ходячий «cfront».
          Ответить
        • > И нахуя этот "std::views"

          а) Показать псевдофункциональным дешёвкам как должны выглядеть zero-coast абстракции.

          б) Оно ленивое и функциональное.
          Ответить

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