1. C++ / Говнокод #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, 26 Октября 2021

    Комментарии (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
                            Ответить
                          • > интересную ёблю с шаблонами
                            Sounds like C++
                            Ответить
                          • Ну так 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 я даже не говорю.
                  Ответить
                  • На хуексинах.
                    Ответить
                    • Начинается...
                      Ответить
                      • Я же рассказывал почему я ненавижу хуексины?
                        Ответить
                        • Потому что они прогрызают стенку тела добычи, обычно в области жабр, и проникают в полость тела, поедая сначала внутренности, а потом и мышцы. Если жертва ещё способна к сопротивлению, миксины проникают под её жаберную крышку и выделяют обильную слизь. В результате жабры жертвы перестают нормально работать, и рыба погибает от удушья?
                          Ответить
                          • Это про джаваскриптеров?
                            Ответить
                          • Нет.
                            Ответить
                            • А тогда почему?
                              Ответить
                              • Просто личная неприязнь. Один долбоёб с прошлой работы называл всё «миксинами» и «проксинами». Ещё там были «контроллеры» и «моча».
                                Ответить
                                • Я бы еще добавил
                                  * Менеджеры
                                  * Провайдеры
                                  * Утилы
                                  Ответить
                                  • * Хелперы
                                    Ответить
                                  • УтилПровайдерМенеджеровХелперовКонтролле раМиксинов
                                    Ответить
                                    • Есть даже такая файка https://gcode.space/#!/20396#comment352548
                                      Ответить
                                      • Еще рекомендую SDK, Framework, library, toolset и API.

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

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

                        Хотя если в структуре лежат какие-нить дескрипторы/хендлеры то там всякие штуки могут быть смешные
                        Ответить
                      • Но на PHP вы из принципа не перейдёте...
                        Ответить
      • Меньше писать, ну
        Ответить
    • Блядь как же я ненавижу жаву

      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.
                  Ответить

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