Кресты / Говнокод #27768 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
auto DivisibleBy = [](int d)
    {
        return [d](int m) { return m % d == 0; };
    };
 
    if (ranges::any_of(v, DivisibleBy(7))) {
        std::cout << "At least one number is divisible by 7\n";
    }

https://en.cppreference.com/w/cpp/algorithm/ranges/all_any_none_of

Запостил: digitalEugene digitalEugene, (Updated )

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

  • кто такие niebloids?

    Можно я возьму себе ник "ниеблоид"?

    А так-то могу на руби перевести. Хочешь?
    [1,2,3,7].any?{|x| x % 7 == 0}


    ЗЫ: Ниеблоиды это такие функции, которые отключают ADL.
    Так названы в честь Эрика Ниеблёра
    Ответить
  • Говно какое-то. Чем их цикл "for" не устраивает?
    Ответить
    • У крестостандартизаторов есть мечта перетащить всех функциональщиков на кресты. Поэтому они всеми силами показывают, что кресты тоже могут быть функциональными.

      Ведь когда-нибудь ты сможешь написать:
      auto some_numbers = get_input_stream().transform(get_data<int>).or_else(assign_empty_collection<std::vector<int>>).and_then(std::functional::conditional(ranges::monadic_adaptor<ranges::any_of>(DivisibleBy(7)), ranges::monadic_adaptor<ranges::for_each>([](auto& x){ x *= 2; }))

      Правда просто и понятно?

      .and_then и .or_else это реальное включение в С++23:
      http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0798r8.html
      Ответить
      • Этот высер 1:1 в духе стримов из JAWA. Так что они скорее яванских людей привлекут.
        Ответить
      • http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0798r8.html#motivationimage
        > ... Unfortunately, chaining together many computations which may or may not produce a value can be verbose, as empty-checking code will be mixed in with the actual programming logic. As an example, the following code automatically extracts cats from images and makes them more cute:
        get_cute_cat (const image& img) {
            return add_rainbow(
                     make_smaller(
                       make_eyes_sparkle(
                         add_bow_tie(
                           crop_to_cat(img))));
        }

        But there’s a problem. What if there’s not a cat in the picture? What if there’s no good place to add a bow tie? What if it has its back turned and we can’t make its eyes sparkle? Some of these operations could fail.

        Ну так а нахуя вообще делать этот "chaining together many computations"? Почему б не написать код в обычном стиле, с if-else? Зачем создавать себе проблемы, а потом героически их решать через какую-то херню?
        Ответить
        • > Почему б не написать код в обычном стиле, с if-else?

          Хотят чтобы покороче да с монадками.
          Ответить
        • > Зачем создавать себе проблемы, а потом героически их решать через какую-то херню?
          Job Security.
          Ответить
        • Чтобы не писать много унылого кода.
          Ответить
          • И взамен писать много интересного и разнообразного...
            Ответить
            • Ну писать всё таки меньше. Просто разнообразность растет очень уж круто, так что тут главное не увлекаться.
              Ответить
              • Если посмотреть на какой-нибудь гредл, то хочется сделать выбор в пользу унылого кода...
                Ответить
                • В гредле много магии, и DSL на основе магии это говно, мы про это как-то тёрли уже)

                  Но в С++ у тебя хотя бы стат типизация, так что граница пиздеца пролегает чуть дальше.

                  Совсем импреративный код это тоже пиздец: говорю как жаваёб, заставший шестую джаву, где (в отличие от плюсов) даже не было "algorithms".


                  Я бы сказал, что если строчка с функциональной магией не вмещается в 80 символов, но надо её распиливать
                  Ответить
                  • > так что граница пиздеца пролегает чуть дальше

                    Где-то в районе boost::spirit?
                    Ответить
                    • Типа написать свой DSL на boost::spirit?

                      Так делать не нужно, если конечно это не DSL уровня "key=value", но такие "дсли" уже есть
                      Ответить
                      • > DSL на boost::spirit

                        We need to go deeper?

                        Не, я просто про boost::spirit. Он сам по себе уже DSL и превращает скучный парсер в интересную ёблю с шаблонами.
                        Ответить
                        • > Он сам по себе уже DSL и превращает скучный парсер в интересную ёблю с шаблонами.

                          И что там может быть интересного в этих шаблонах? Это ж, блядь, сраное ублюдское кривое говнище, работающее поверх кривой и убогой говносистемы типов, унаследованной от сишки.
                          https://i.imgur.com/eP7s24N.jpg
                          Ответить
                        • Ну так boost же, ты должен любить шаблоны.
                          Ответить
                          • Я недавно нахерачил лексер на JFlex чтобы разобрать говнецо.

                            То есть это не лексер, а такой конченый автомат со стеком.

                            Там пишешь рагулярки, и состояния и переходы. Он преобразует это в детерменированный автомат, и генерит класс.

                            Но я свой DSL не делал конечно, просто надо было вычленить одно говно из другово
                            Ответить
                        • boost::spirit — хорошо. Именно благодаря нему я выучила нормальные ФП языки. Выучить haskell и написать DSL на нём оказалось быстрее, чем някаться с ним.
                          Ответить
                  • > Но в С++ у тебя хотя бы стат типизация, так что граница пиздеца пролегает чуть дальше.

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

                      Это как если бы от неправильно подключенного крана в ванне у тебя текла батарея
                      Ответить
                        • ЭлектроБойлер, заземлённый на ванну в незаземленном доме, да.
                          Чтобы потом от трубы в подвале кого-то ебануло малость

                          Ошибки в шаблонах вроде так и выглядят
                          Ответить
          • Так нихуя там по-сути не меняется. Я такое говно намакроебить вполне могу.
            Вот они предлагают такую ебанину:
            std::optional<int> foo() {
                return
                  a().and_then(b)
                     .and_then(c)
                     .and_then(d)
                     .and_then(e);
            }

            Это типа то же самое, что и
            std::optional<int> foo() {
                auto a = a();
                if (a == std::nullopt) return std::nullopt;
                auto b = b(a);
                if (b == std::nullopt) return std::nullopt;
                auto c = c(b);
                if (c == std::nullopt) return std::nullopt;
                auto d = d(c);
                if (d == std::nullopt) return std::nullopt;
                auto e = e(d);
                if (e == std::nullopt) return std::nullopt;
                return e;
            }

            верно? А такую вот ебанину вполне намакроебить можно.
            Ответить
            • >намакроебить

              Если какую-то функциональность может намакроебить j123, то такая функциональность не нужна
              Ответить
              • Такую хуйню можно и на миксинах из D нахуярить, если что. Про LISP я даже не говорю.
                Ответить
                    • Я же рассказывал почему я ненавижу хуексины?
                      Ответить
                      • Потому что они прогрызают стенку тела добычи, обычно в области жабр, и проникают в полость тела, поедая сначала внутренности, а потом и мышцы. Если жертва ещё способна к сопротивлению, миксины проникают под её жаберную крышку и выделяют обильную слизь. В результате жабры жертвы перестают нормально работать, и рыба погибает от удушья?
                        Ответить
                            • Просто личная неприязнь. Один долбоёб с прошлой работы называл всё «миксинами» и «проксинами». Ещё там были «контроллеры» и «моча».
                              Ответить
                              • Я бы еще добавил
                                * Менеджеры
                                * Провайдеры
                                * Утилы
                                Ответить
                                    • Еще рекомендую SDK, Framework, library, toolset и API.

                                      Кстати, у яблочников есть Foundation. Ни у кого никогда такого термина я не встречал
                                      Ответить
                                      • а protocol вместо interface?

                                        кстати, значение Framework эпплы тоже извратили
                                        Ответить
                                      • правда, справедливости ради, нужно отметить, что во времена, когда они называли protocol, языков с интерфейсами ещё могло и не быть
                                        Ответить
                • У j123 в "си" не может что-то "не копироваться". И перегрузок у него нет
                  Ответить
                  • В «Си» может только «скопироваться, но попытка работать с копией всё пидорасит».
                    Ответить
                    • Чтобы копию структуры не пидорасило после копирования достаточно всего лишь...
                      Ответить
                    • Не возвращайте массив по возможности:)

                      Хотя если в структуре лежат какие-нить дескрипторы/хендлеры то там всякие штуки могут быть смешные
                      Ответить
  • Блядь как же я ненавижу жаву

    A mapped byte buffer and the file mapping that it represents remain valid until the buffer itself is garbage-collected.

    Я потом пытаюсь писнуть в файл, и блядь "The requested operation cannot be performed on a file with a user-mapped section open."


    СУУУУУУУУУУУУУКААААААААААААААААААААА
    https://bugs.java.com/bugdatabase/view_bug.do?bug_id=4724038
    Ответить
    • Не всё коту масленица...

      А нету какой-нибудь сторонней либы с явным unmap'ом? Вроде на гк упоминали что-то.
      Ответить
      • Есть хак через рефлексию
        // in Java 9+, the "official" dispose method is sun.misc.Unsafe#invokeCleaner
              Object unsafe = ReflectionUtil.getUnsafe();
              try {
                MethodType type = MethodType.methodType(void.class, ByteBuffer.class);
                MethodHandle handle = MethodHandles.lookup().findVirtual(unsafe.getClass(), "invokeCleaner", type);
                handle.invoke(unsafe, buffer);
                return true;
              }
              catch (Throwable t) {
                Logger.getInstance(ByteBufferUtil.class).warn(t);
                return false;
              }


        Так-то я могу и на JNA написать, просто не хочется писать два раза (для прыщ и для сперм)
        Ответить
        • Какой unsafe )))

          Будут сегфолты как в няшной если вдруг у кого-то осталась ссылочка на это говно? Или там к замапанной памяти доступ только через методы и они начнут кидать исключения?
          Ответить
          • Думаю что да. Кстати, этот клинер работает вообще для любого дайрект буфера (сиречь для буфера в нативной памяти).

            Так что вполне реально получить болтающийся указатель.

            В общем в джаве нужно с памятью аккуратно обращаться. Автоматических средств, как в С++, в ней нет(
            Ответить
              • Пруф
                import java.lang.reflect.InvocationTargetException;
                import java.nio.ByteBuffer;
                
                public class Foo {
                    private static void closeDirectBuffer(ByteBuffer cb) throws InvocationTargetException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, NoSuchFieldException {
                        Class unsafeClass;
                        try {
                            unsafeClass = Class.forName("sun.misc.Unsafe");
                        } catch (Exception ex) {
                            // jdk.internal.misc.Unsafe doesn't yet have an invokeCleaner() method,
                            // but that method should be added if sun.misc.Unsafe is removed.
                            unsafeClass = Class.forName("jdk.internal.misc.Unsafe");
                        }
                        var clean = unsafeClass.getMethod("invokeCleaner", ByteBuffer.class);
                        clean.setAccessible(true);
                        var theUnsafeField = unsafeClass.getDeclaredField("theUnsafe");
                        theUnsafeField.setAccessible(true);
                        var theUnsafe = theUnsafeField.get(null);
                        clean.invoke(theUnsafe, cb);
                    }
                
                    public static void main(String[] args) throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, NoSuchMethodException, NoSuchFieldException {
                        var byteBuffer = ByteBuffer.allocateDirect(1024); //маллок
                        closeDirectBuffer(byteBuffer); //free
                
                        byteBuffer.put((byte) 1); //пись-пись
                        System.out.println("YES"); //никогда не выведеца
                
                    }
                }


                Process finished with exit code -1073740940 (0xC0000374)

                Exception code 0xc0000374 means you're facing heap corruption.
                Ответить

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8