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

    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
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    function t_undef(s?: string)
    {
    	assert((s == undefined) == true, "is not undefined")
    	assert((s != undefined) == false, "is undefined")
    	assert((s >  undefined) == false, "not >");
    	assert((s <  undefined) == false, "not <");
    	assert((s >= undefined) == true, "not >=");
    	assert((s <= undefined) == true, "not <=");
    }
    
    function t_val(s?: string)
    {
    	assert((s == undefined) == false, "is undefined")
    	assert((s != undefined) == true, "is not undefined")
    	assert((s >  undefined) == true, ">");
    	assert((s <  undefined) == false, "<");
    	assert((s >= undefined) == true, ">=");
    	assert((s <= undefined) == false, "<=");
    }
    
    function f(s?: string)
    {
    	print(s == undefined, s != undefined, s > undefined, s < undefined, s >= undefined, s <= undefined);
    }
    
    function main() {
    	f();
    	t_undef();
    	f("asd");
    	t_val("asd");
    }

    внеочередной говнокод для работы с андефами. А ваш говно-компилятор умеет так (особенно С и С++)

    гы гы

    Запостил: ASD_77, 21 Мая 2021

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

    • дамп для интересующихся. но если честно даже я престал его анализировать изза возросшей сложности https://pastebin.com/e4s9GZMj
      Ответить
    • > А ваш говно-компилятор умеет так (особенно С и С++)
      Ня?
      http://coliru.stacked-crooked.com/a/b64e8860f1fd88b2
      Ответить
      • а можно убрать -std=c++2a и что будет? т.е. что бы звпилить optional надо было целый новый компилятор делать?
        Ответить
        • Можно переключить на -std=c++17, или даже откатиться на -std=c++03 и пользоваться optional из бустятины.
          Ответить
        • Считали, что optional и прочее в стандартной либе нахуй не нужен. За 20 лет решили всё-таки стандартизировать половину буста
          Ответить
          • Сначала они тебя не замечают, потом смеются над тобой, потом.. )

            Кстати, как он работает? Занимает в памяти sizeof(pituh) плюс флажок "petuh_exists", и там в питухе либо настоящий питух, либо мусор?
            Ответить
            • Да. Очень грубо (без noexcept'ов, constexpr'ов, деструктора, std::launder и прочего):
              template<typename T>
              class Optional {
              public:
                  template<typename... Args>
                  void emplace(Args &&... args) {
                      new (cast()) T(std::forward<Args>(args)...);
                      has_value_v = true;
                  }
                  
                  bool has_value() {
                      return has_value_v;
                  }
                  
                  T & value() {
                      if (!has_value()) {
                          throw nyh_value_error();
                      }
                      return *cast();
                  }
                  
              private:
                  T *cast() {
                      return reinterpret_cast<T*>(&data);
                  }
              
                  std::aligned_storage_t<sizeof(T), alignof(T)> data;
                  bool has_value_v = false;
              };
              Ответить
              • > if (!has_value()) {
                > throw nyh_value_error();
                зачем мне лишняя проверка?

                Пусть пользователь проверяет has_value сам, иначе UB

                Я так примерно и представлял вощем, спасибо)

                В C# давным давно завезли Nullable (он же "?"), позволющий value type быть нулом.
                Но я боюсь, что там тупо кладут его в кучу и заменяют на указатель
                Ответить
                • Ну да, проверка ня нужна. В MS CRT optional сделали через union, кстати:
                  template <class _Ty>
                  struct _Optional_destruct_base<_Ty, false> { // either contains a value of _Ty or is empty (non-trivial destructor)
                      union {
                          _Nontrivial_dummy_type _Dummy;
                          remove_const_t<_Ty> _Value;
                      };
                      bool _Has_value;
                  
                      ~_Optional_destruct_base() noexcept {
                          if (_Has_value) {
                              _Destroy_in_place(_Value);
                          }
                      }
                  
                      constexpr _Optional_destruct_base() noexcept : _Dummy{}, _Has_value{false} {} // initialize an empty optional
                  
                      template <class... _Types>
                      constexpr explicit _Optional_destruct_base(in_place_t, _Types&&... _Args)
                          : _Value(_STD forward<_Types>(_Args)...), _Has_value{true} {} // initialize contained value with _Args...
                  
                      _Optional_destruct_base(const _Optional_destruct_base&) = default;
                      _Optional_destruct_base(_Optional_destruct_base&&)      = default;
                      _Optional_destruct_base& operator=(const _Optional_destruct_base&) = default;
                      _Optional_destruct_base& operator=(_Optional_destruct_base&&) = default;
                  
                      void reset() noexcept {
                          if (_Has_value) {
                              _Destroy_in_place(_Value);
                              _Has_value = false;
                          }
                      }
                  };
                  Ответить
                  • Как можно было придумать такой отвратительный кодстайл?
                    Ответить
                    • Гост придумывал.
                      Ответить
                    • Это ещё с няшной тянется. Вкратце, пользователь может объявить любое имя, не зарезервированное стандартом и библиотека не должна от этого сломаться.

                      поэтому bool has_value объявить нельзя — первый же #define has_value это сломает. Поэтому разработчикам библиотек и приходится использовать имена _Петух или __петух
                      Ответить
                  • вот поэтому в Юте с четверга запрещено использовать CRT

                    https://www.gannett-cdn.com/presto/2021/05/20/PSTG/a7347fb5-7adb-46de-b5e7-ee47ab8d08fb-AP21139664333434.jpg
                    Ответить
                    • Так вроде LCD давно везде

                      Или они про сишную стандартную либу?
                      Ответить
                      • Они про модуль Паскаля для работы с консолью и его уебанский порт из Турбо С++, которым всё ещё учат блядь в индии. Каждую весну набегает на форумы куча Раджешов с лабами на ёбаном турбоцпп.
                        Ответить
                • > В C# давным давно завезли Nullable (он же "?"), позволющий value type быть нулом.
                  > Но я боюсь, что там тупо кладут его в кучу и заменяют на указатель
                  Nullable — это на самом деле структура, а структура — value type. Когда наллаблу присваивается null, это на самом деле значит, что это Nullable<T> (где T — value-type), у которого HasValue=false, а при попытке получить Value выбрасывается эксепшен. Хранится ли он в стеке или в куче — это уже отдельный вопрос, как и для любого другого value type.
                  Ответить
                  • а, ну то есть там именно такой Optional и получается: реально данные и булевый флажок

                    Всё как в С+

                    А вот в джавке бы так не получилось, бо метапррограммирования нету(
                    Ответить
                    • Есть генерики, Object и ссылочность всего. Был бы флажок, Object value и функция, кастующая объект к нужному классу.
                      Ответить
                      • В джаве да. Это значит, что обычный int превратился бы во враппер Integer в куче. Жуткий оверхед.

                        Забавно, что в C# они не забоялись, и сделали генерики ближе к шаблонам: Petuh<int> это реальный класс с полем int, а не с полем Object
                        Ответить
            • В теории, да. Возможно, какие-то кокомпиляторы умеют флаг куда-нибудь в padding прятать.
              Ответить
      • да класная игра была soul reaver
        Ответить
    • > андефами
      > особенно С
      #define WISDOM 42
      cowsay(WISDOM);
      #undef WISDOM
      Ответить

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