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

    −16

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    отгадай язык и что делает эта процедура
    [code]
    template<class T, class U>
    auto add(T t, U u) -> decltype(t + u)
    {
        return t + u;
    }
    [/code]

    Запостил: dim1r, 11 Ноября 2015

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

    • Это си плюс плюс, функция выполняет копирование своих аргументов, а потом сложение результатов (с помощью оператора +).
      Ответить
      • нововведения нам нужны для удобства, а удобства, - что бы запутывать
        Ответить
    • хрень какая-то, зачем и ауто, и стрелочка?
      Ответить
      • В c++11 компилятор почему-то сам не может выводить типы возвращаемых значений в шаблонах. Стрелочка нужна потому, что имена t и u ещё не видны компилятору до их объявления. Паскалевский стиль объявления (ключевое слово, имя, тип) РУЛИТ.
        Недавно об этом срач был на кабре
        http://habrahabr.ru/post/270081/#comment_8643629
        Ответить
        • на самого себя линк не кинешь -- никто не кинет
          Ответить
        • в go это изменили.
          Ответить
        • А я всегда говорил, что Паскаль — лучший.
          Ответить
          • это да особено хороши функции внутри других функций. Многое другое не так хорошо. Но это просто отлично.
            Ответить
            • > функции внутри других функций
              Главное не забывать, что это не замыкания.
              Ответить
              • Их можно возвращать как замыкания в версии 2009 года.
                Ответить
            • в с++ сейчас лямбды есть, тоже являются функциями внутри функций
              Ответить
              • И они настоящие лямбды, в отличие от той паскалевской пародии.
                Ответить
                • а не кто и не говорил, что функции в паскале это лямбды.
                  Ответить
          • показать все, что скрытоПо своему опыту программирования на разных языках (с++, delphi, perl, java, plsql...) мне больше всего нравится plsql, потому что там меньше всего ошибок получается. В частности изза того, что там почти не используются классы. По сути классы заменяют пакеты, которые эквивалентны одному экземпляру struct для каждой сессии. Чем меньше посторонних понятий в языке, тем лучше для всего проекта.
            Ответить
            • показать все, что скрытоКто минуснул - тому вменяется 3 года на моем проекте без права выхода в интернет и ежедневным выкладыванием фотографии со стареющим на глазах лицом и седеющими висками :):):):)
              Ответить
            • твоего опыта программирования не хватило для того, чтобы распознать функцию суммы двух чисел.
              Ответить
              • Ну не обязательно с числами и необязательно сумма: смотря как оператор определен и смотря что там за классы будут при детализации шаблона.

                "нововведения нам нужны для удобства, а удобства, - что бы запутывать"
                Ответить
                • тебе полегчает, если я поправлюсь:
                  ... функцию абстрактного сложения двух аргументов*
                  Ответить
            • > мне больше всего нравится plsql, потому что там меньше всего ошибок получается
              тормозное малофункциональное синтаксически-избыточное говно из 80х

              в нем как раз и не хватает темплейтов и приходится вымораживаться через execute immediate
              Ответить
              • По мне так, темплейты и классы избыточны и создают слишком много лишних понятий. А чем больше понятий, тем больше взаимосвязей между понятиями. Количество связей растет квадратично, каждое новое понятие начинает интерферировать со всеми предыдущими. Конечно, в универсальных языках это неизбежно, но видели бы Вы лица опытных програмистов, которые начинают копать суперуниверсальные классы и по 2 месяца нихрена не понимают как именно они реализуют какую-нибудь простую задачку, на которую не надо ума.
                Ответить
                • > темплейты и классы избыточны
                  первое позволяет сэкономить те самые связи, т.к. обобщенное программирование позволяет писать код один раз, а использовать - много

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

                  а уж о преимуществах инкапсуляции (модульности, изоляции кода и приватных данных), "контракта" (в виде интерфейсов/классов), позднего связывания (полиморфизма) в больших проектах и спорить не стоит

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

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

                    потом бросают все и делаю так
                    if(old_version){ 10 тыс строк кода}
                    if(new_version){ Control-C Control-V 10 тыс строк кода c небольшими правками}
                    Ответить
        • Не надо путать недостатки дизайна языка и недоработки компилятора. То, что компилятор не может понять конструкцию decltype(t + u) add(T t, U u) {...} не значит, что язык плохо спроектирован, а "паскаль рулит".

          имо есть пара изъянов, связанных с объявлением типов, но они вообще в других местах.
          Указатели на функцию: я хочу вводить *int(int,int) func_ptr; вместо int(*funct_ptr)(int,int);
          Или, например:
          int A[10][10];
          int (*B)[10][10];
          что здесь массив указателей, а что - указатель на массив? Почему бы не сделать
          *[10]int A; - указатель на массив из 10 элементов типа int
          [10]*int A; - массив из десяти указателей на int.
          И эти недочеты не уйдут от смены типа объявления переменной
          Ответить
          • http://cdecl.org
            Ответить
          • > паскаль рулит
            Где я такое говорил? Я лишь говорил, что Стиль (Способ) Объявления Переменных Рулит. Он появился ещё до сишки, но K&R почему-то решили его не использовать. Во многих нормально спроектированных языках используется именно такой подход (SML, Ocaml, Haskell, Scala, Rust, Nemerle, Go, ...)

            > не значит, что язык плохо спроектирован
            Кмк, то, что нужно вводить второй синтаксис для указания типа, означает как раз это. Вроде бы всем очевидно, что с точки зрения априорного дизайна C++ - полное УГ. Другое дело, что текущий дизайн является в некотором роде локальным оптимумом - движение в любую сторону только навредило бы развитию языка, это становится очевидно из единственной читабельной книжки Страуструпа - "The Design and Evolution of C++".

            > И эти недочеты не уйдут от смены типа объявления переменной
            Эти недочёты фиксятся тривиально, достаточно ввести один регулярный синтаксис построения типа:
            var a : Ptr[Array[Int, 10]]
            var b : Array[Ptr[Int], 10]
            var c : Func[Int, Int, Int]
            Ответить
            • я про фому, вы про ерему.
              Проблемы, которые сейчас есть у синтаксиса c++, не решить введением var и перенесением типа переменной правее названия.

              По нотации, которую вы предлагаете:
              var main : Func[argc : int, argv : Ptr[Array[char]]] ...
              точно проще читать?
              Ответить
              • > Проблемы, которые сейчас есть у синтаксиса c++, не решить введением
                Начнём с того, что проблемы синтаксиса C++ вообще уже ничем не решить - любые изменения будут только добавлять проблем. Речь идёт о том, что проблем можно было бы избежать, если бы K&R 50 лет назад сделали синтаксис объявления переменных как в Pascal, а не как в Fortran.

                > точно проще читать?
                Синтаксис должен быть скорее таким:
                fn main(argc: Int, argv : Ptr[Ptr[Char]]]): Int

                Func[X, Y, R] нужен для ссылок на фукнции, fn - для объявления/определения функций.
                var f : Func[Int, Int] = fn (x: Int) : Int { return x * x; }
                Ответить
                • объявления типов в с++, между прочим, получаются самыми лаконичными с точки зрения длины кода. По вашей нотации, если функция принимает 2-3 шаблонных аргумента, то её объявление надо записать в 3-4 строки
                  Ответить
                  • > По вашей нотации, если функция принимает 2-3 шаблонных аргумента, то её объявление надо записать в 3-4 строки

                    А можно пример? Что-то я не вижу, откуда берётся такой синтаксический оверхед. Ну разве что заменили звезду на Ptr, скобки с числом - на Array.
                    Сырые указатели в крестах я использую очень редко, а массивы с размерностью передавать параметром функции в сишке/крестах - нонсенс.
                    Ответить
                    • * - один символ. Ptr[] - пять символов.
                      В вашем же примере:
                      fn main(argc: Int, argv : Ptr[Ptr[Char]]]): Int // 47 символов
                      вместо
                      int main(int argc, char** argv) // 31 символ
                      И где же оверхед?

                      В tuple, например, вполне можно засунуть, например, двумерный массив комплексных чисел (как удобно, так и десериализую). И мне совершенно не нужна пара десятков лишних символов в объявлении такой конструкции.
                      Ответить
                      • > 3-4 строки
                        > пара десятков лишних символов
                        Не вяжется как-то.

                        > совершенно не нужна пара десятков лишних символов в объявлении такой конструкции

                        Тайпдефы в помощь.
                        Ответить
                        • я был уверен что в какой-то момент вы прибегнете к этому последнему и очень слабому аргументу.
                          Затайпдефать я могу хоть любой тип, который использую, и причина, по которой я этого не делаю - генерируются много бестолковых строк кода там, где они совсем не нужны. И говорить "лучше писать больше кода чтобы делать больше тайпдефов чтобы в итоге всё стало как было + объявление тайпдефа" глупо.

                          И да, если вам так нравятся паскалевские нотации, флаг в руки:

                          typedef auto fn;
                          fn someFunc(int a, int b) -> int { return a+b; }
                          Но почему то же вы так не делаете
                          Ответить
                          • > Но почему то же вы так не делаете

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

                            > Затайпдефать я могу хоть любой тип... я этого не делаю

                            А вот я очень активно использую тайпдефы. Они позволяют создавать бесплатные абстрации и делают код более читабельным. Кусок кода из реального проекта:
                            using TaskId = std::string;
                            using TaskIds = std::vector<TaskId>;
                            using Timestamp = std::chrono::system_clock::time_point;


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

                              > Кусок кода из реального проекта:
                              Приведенный пример хорош, но я не с этим спорю. Мне не нравится идея использовать тайпдефы там, где их необходимость обусловлена ТОЛЬКО громоздкостью конструкции.

                              > А мне вот кажется, что экономить на символах в ущерб понятности и читаемости - глупо.
                              Малое количество смысла в большом куске текста тоже затрудняет восприятие.
                              Ответить
                              • > ТОЛЬКО громоздкостью конструкции
                                Громоздкость конструкции означает, что где-то потерялась абстракция.

                                > Мб дело не в крестах, а в текстовом редакторе?

                                Текстовый редактор отличный, из двух десятков языков у него только с крестами проблемы :) Не у него одного, кстати. Без привязки к компилятору кресты вообще подкрашивать очень сложно, регулярками не обойтись.
                                Ответить
                                • > Громоздкость конструкции означает, что где-то потерялась абстракция.
                                  У меня есть строка в 20-30 символов, которая понятна и без абстракций. По вашему, надо её расписать на 40 символов, и то, что она при этом станет громоздкой, вызвано тем, что в ней "потерялась абстракция". Не путайте причины и следствия, пожалуйста
                                  Ответить
                                  • > 40 символов
                                    > громоздкой

                                    У вас какие-то странные представления о громоздкости.
                                    public static <I, O> ListenableFuture<O> chain(ListenableFuture<I> input, Function<? super I, ? extends ListenableFuture<? extends O>> function)
                                    Вот это громоздко, и тут никакие тайпдефы не помогут :)
                                    Ответить
                      • Синтаксическая экономия? Надеюсь, тебе меньше 25 лет.
                        Ответить
                        • А вдруг он до сих пор программы хранит на дискетках, так что каждый байт исходника важен?
                          Ответить
                        • вам нравится искать что значит каждое второе слово в коде?
                          Ответить
                          • Пишешь на языках, продолжения которых не знаешь?
                            Ответить
                            • "читать не умею но дай-ка ляпну".
                              Речь не о символах языка/фреймворков
                              Ответить
                              • Разговор вроде был именно о символах языка.
                                Ответить
                                • а, всё, мой косяк - неправильно понял, какое именно сообщение вы цитируете.
                                  Ответить
                • Main : Func [args : Slice of Slice of Char] of Int = 
                  {
                   
                  }
                  Ответить
                  • > args : Slice
                    Нет, мне что-то не очень нравятся имена объектов вперемешку с именами типов без дополнительных конструкций вроде какого-нибудь TypeOf
                    var x : Vector[TypeOf(expr)];
                    Правда, в Ocaml этому есть применение: там имена аргументов могут быть частью контракта функции, так работают именованные и опциональные аргументы, их можно передавать в различном порядке.
                    Ответить
                  • Какие слайсы в типах? Типы это ж из теории типов, если просто наугад туда добавлять сущности, то ситуацию это свсем не улучшит. Типы нужны для того, чтобы в рамках этой самой системы можно было во вменяемое время удостоверится в корректности програмы. Для этого нужно чтобы эта проверка сводилась к чему-то, что можно посчитать в это самое время, чему-то эквивалентному максимум рекурсивному языку (если проверка заключается в принимает / не принимает автомат язык), но лучше - к чему-то типа регулярного языка, или, другими словами, лучше - логика нулевого порядка.
                    Ответить
                    • Бля, это ссылка на фрагмент массива, такие обычные слайсы. Я считаю, что ссылки-на-фрагменты должны быть в основе языка.
                      Ответить
                • template<class T> using Ptr<T> = T*;
                  template<class T, int N> using Array<T, N> = T[N];
                  template<class T, class... Arg> using Func<T, Arg> = T()(Arg...);
                  и прочее в myproject.h -- и на плохом языке можно писать хороший код.

                  За синтаксис в последней строке не отвечаю.
                  Ответить
                  • http://govnokod.ru/19028
                    получится как тут
                    Ответить
                  • Ты потрясающе умудрился определить используемые мной классы так, что они становятся абсолютно бесполезны в плане безопасности.
                    Ответить
                    • погодите секундочку. Одно дело если вас смущал синтаксис, другое - возможности языка. Все безопасные классы есть в плюсах (std::array, std::vector, std::shared_ptr, std::function и пр.), пользуйтесь на здоровье.
                      Ответить
              • >>> что здесь массив указателей, а что - указатель на массив? Почему бы не сделать *[10]int A
                >> var a : Ptr[Array[Int, 10]]
                > точно проще читать?
                Точно проще читать.
                1. По умолчанию с типами творится какая-то странная каша. Типы-слова (int, float), типы-символы (*,[]), типы-функции (std::vector) - не сведено к общему знаменателю, запутывает.
                2. Типы в общем случае принимают более одного аргумента и представляют собой какое-то выражение.

                У Вас тип - линейная питушня, которая не расширяется на общий случай.
                У Романа - симметричная система записи без странных исключений.
                Ответить
                • > Точно проще читать.
                  Предположим, существует язык, в котором эквивалентом строки
                  std::string (*makeHash)(const char *string, int32_t seed);
                  является
                  declare variable makeHash as pointer_to function taking pointer_to const char and unsigned int32 returning type string from std;
                  Это гиперболизация, офк, но, исходя из ваших комментариев выше, такой язык является чуть ли не идеалом, к которому надо стремиться. И я повторю вопрос: удобно читать?
                  Зачастую скорость восприятия обусловлена только скоростью чтения.
                  Ответить
                  • Когда не понимаешь сути, остаётся только доводить до абсурда...
                    Ответить
                  • Предположим, существует язык, в котором эквивалентом строки
                    std::string (*makeHash)(const char *string, int32_t seed);
                    является
                    №!::~~ [[*make#]](!! ~ *~~, @32 seed);

                    Любую запись можно гиперболизировать.

                    > Зачастую скорость восприятия обусловлена только скоростью чтения.
                    Да, в частном случае char* читается легче, чем ref<char>
                    Да, значки часто удобнее в программировании и математике. Несколько раз я участвовал в обсуждениях на эту тему, где стоял за значки именно из-за скорости восприятия компактных выражений.
                    Но здесь в чуть более сложных случаях, чем char* начинается какая-то фигня с *, [], const, volatile, функций. Становится проще запомнить, как описывается указатель массив, чем пытаться вычислять.
                    Но от сложных структур чаще всего отказываются, из-за чего они встречаются гораздо реже, чем более простые. А значит фиг тут что выучишь, фиг что посчитаешь, т.к. в следующий раз встретишь этот набор скобок и звёзд не так скоро.
                    В итоге, начиная где-то с измерения 2-3, запись Романа уже проще, чем обычная сишная из-за того, что прочитать длинную понятную строчку легче, чем раздумывать над короткой и менее понятной.

                    Но вообще, самая лучшая, самая короткая и самая понятная запись типа - в JSON. Видим значение - видим его тип. Без посредников:
                    {
                      "a": [
                        {"name": "Wsd Rgn", "value": 1},
                        {"name": "Rfv Ujm", "value": 114}
                      ],
                      "b": [
                        {"name": "Edc Edf", "value": 8}
                      ]
                    }

                    В сишном стиле это было бы что-то вроде object x{char*}[]{char*}.
                    В C++ - map<string, vector<map<string, object>>> x.
                    В JSON: нет записи - нет проблем.
                    Ответить
                    • > №!::~~ [[*make#]](!! ~ *~~, @32 seed);
                      > Любую запись можно гиперболизировать.
                      Вывод: регулярки придумал сам дьявол

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

                      В таких случаях помогает вывод типов - писать не надо, а компилятор осведомлён.
                      Ответить
                  • type Hasher = Func[CString, Int32, String]
                    Ответить
                    • забыли Ptr[]. И опять же, для такой записи нужно
                      using CString = const char*;
                      using Int32 = int32_t;
                      using String = std::string;
                      Ответить
                      • > забыли Ptr[]
                        > using CString = const char*;

                        Не забыл, а предположил, что стандартная библиотека делает очевидный тайпдеф для такого частого кейса.
                        type CString = Ptr[Const[Char]]


                        > using Int32 = int32_t;
                        Это даже не смешно

                        > using String = std::string;
                        Лол, ну пусть будет Std.String
                        Ответить
                        • предлагаю вам написать свой язык с преферансом и барышнями.
                          Ответить
                          • > свой язык
                            Нет уж, мне некогда этим заниматься. Люди пытались запилить годноту в Clay, но он, кажется, помер
                            https://github.com/jckarter/clay/wiki
                            Ответить
                            • > Люди пытались запилить годноту в Clay, но он, кажется, помер
                              Как однажды заявил Страуструп: "есть два типа языков программирования: те, которые все критикуют, и те, которыми никто не пользуется"
                              Ответить
                              • Что не отменяет то, что цпп - говно
                                Ответить
                                • Ваши предложения?
                                  Ответить
                                  • 1 отменить с++
                                    2 отловить всех крестоблядей и сжечь
                                    3 ???
                                    4 PROFIT
                                    Ответить
                                    • даешь Unreal Engine 5 на питоне!
                                      Ответить
                                      • Unreal Engine 5 нинужон
                                        Ответить
                                        • вам кроме fleshlight'a точно ничего не нужно... но и в их техпроцессе точно есть что-то, работающее на сях
                                          Ответить
                                          • на сях
                                            ты сам это сказал
                                            на сях
                                            Ответить
                                            • ты всё равно мне не докажешь что под "сями" я не подразумевал плюсы
                                              Ответить
            • Только лучше так:
              var a : Ptr[Array[10,Int,]]
              var b : Array[10,Ptr[Int]]
              var c : Func[Int, Int, Int]

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

              var a : Ptr[Array[10] of Int] // или var a : Ptr of Array[10] of Int;
              var b : Array[10] of Ptr[Int] 
              var c : Func[Int, Int] of Int
              Ответить
              • Как-то выделяется оно из общей стройной системы. Наверно проще паскалистов отучить от "of" (Ведь сишников и так придётся отучить писать свои int*[] **х*й[]), чем вводить этот сахарок.

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

                Скажем,
                -- иногда нужен массив чего-то из нужного количества элементов
                family species = array species 2
                family = (flip array) 2
                -- иногда нужен массив с элементами нужного типа
                vector length = array complex length
                vector = array complex
                Ответить
                • > а то и вовсе какой-нибудь функциональный язык

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

                  Вот pure-сишникам будет тяжелее.
                  Ответить
                  • > Вот pure-сишникам будет тяжелее.
                    Из-за чего? Они не смогут смириться из-за того, что пон*ятн*ые[] царские звёздочки и скобочки заменят на длинные попсовые слова? Или из-за конфликта императивного подхода кода с новой функциональной типарадигмой?
                    Ответить
                    • Плохо это или хорошо, но один из основных принципов в развитии с++ - поддержка легаси кода аж с с.
                      Ответить
                    • Потому что это опошляет язык.

                      Раньше только ТруСишник мог с ходу написать сигнатуру функции которая возвращает указатель на массив константных указателей на структуру. А теперь каждый лох сможет.
                      Ответить
                • Сахарок из системы не выбивается, а лес квадратных скобок иногда сокращает.
                  Ответить
          • Вот, держи.
            using func_ptr = int (*) (int,int);
            Ответить
            • да блин, я не против юзать тайпдефы, если я хотя бы дважды пользуюсь этим тайпдефом.
              Ответить
    • >отгадай язык
      c++?
      Ответить
    • Судя по 'code' в квадратных скобочках, это BBcode!
      Ответить
      • Точно? А на постскрипте такое написать нельзя?
        Ответить
        • Не забываем на каком сайте этот тред. А так же помним, что за креатив тут не платят.
          Ответить
      • Полужирный, курсив или перечеркнутый?
        Ответить
    • "а выложу ка я кусок кода в раздел C++ и пусть люди гадают, что за код это мог бы быть"
      Ответить
      • посмотрите коментарии, меня лично умиляет серьезная реакция на шутку на этом сайте
        Ответить
        • Шутки надо маркировать. Мы люди серьезные.
          Ответить
          • сайт изначально не располагает к серьезности, если что
            Ответить
    • Для особых идиотов (обидел, да? Всё равно вы идиоты.), - это выведение возвращаемого типа из разных типов аргументов.
      Ответить
      • Спасибо, кэп. А посоны и не знали.
        Ответить
      • Дяденька, вы идиот?
        Ответить
        • Да. Но иногда его зачатки разума просыпаются, и он пишет вот такой комментарий себе из будущего.
          Ответить
          • Получается, он герой того самого комикса "Как выучить С++ за 21 день".
            Ответить
            • Только он ничего не учил а просто бухал
              Ответить
        • Я - нет. А вот ты редкостный долбоёб. (почитал твои комментарии)
          Ответить
          • а теперь порисуй
            Ответить
          • Кто бы говорил...
            Ответить
            • Ты просто попиздеть зашёл, или хочешь что-то умное сказать?
              Ответить
              • А мне вот кажется, что экономить те самые связи, т.к. обобщенное программировании и математике. Несколько раз я участвовал в обсуждениях на эту тему, где стоял за значки часто удобнее в программисту - ну тут не платят. Полужирный, курсив или перечеркнутый?
                Ответить
                • Вы с kegdan родственники/братья/близнецы? Просто чувствуется общий ход мыслей... Что тот долбоёб хуйню писал, что ты.
                  Ответить
                  • какой то хаскель получается уже > мне больше тайпдефы там, где они совсем не нужна пара десятков лишних символов
                    > громоздкой

                    У вас какие-то странная каша. Типы-слова (int, float), типы-функции внутри другие типов - писать сигнатуру функции которая понятная запись Романа уже проще, чем обычная сишная из-за скоростью чтения. Когда добавили шаблонов изобретать новый язык.

                    Раньше только скоростью чтения. Когда не понимать долбанутые крестовые конструкции.

                    > А мне вот кажется, что это опошляет язык, в которому надо стремиться. И я повторю вопрос: удобно, так и десериализую). И мне совершенно не нужно
                    Ответить

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