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

    +128

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    trait NumericUpperBound[Num1, Num2, UpperBound]
    implicit object NumericUpperBoundIDD extends NumericUpperBound[Int, Double, Double]
    implicit object NumericUpperBoundDID extends NumericUpperBound[Double, Int, Double]
    
    def compareTwoNumbers3[N1, N2, N3](n1: N1, n2: N2)
                                     (implicit nub: NumericUpperBound[N1, N2, N3], 
                                             conv1: NumericConversion[N1, N3], 
                                             conv2: NumericConversion[N2, N3], 
                                               ord: Ordering[N3]): Int = {
      ord compare (conv1 convert n1, conv2 convert n2)
    }

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

    Запостил: wvxvw, 01 Апреля 2013

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

    • Ах, вот это забыл:

      implicit object Int2IntNumericConversion extends NumericConversion[Int, Int] {
        def convert(i: Int): Int = i
      }
      implicit object Double2DoubleNumericConversion extends NumericConversion[Double, Double] {
        def convert(d: Double): Double = d
      }
      implicit object Int2DoubleNumericConversion extends NumericConversion[Int, Double] {
        def convert(i: Int): Double = i.toDouble
      }


      Ну и нужно понимать, что такое нужно написать для, как минимум, всех встроенных числовых классов.
      Ответить
      • Еще, очевидно, забыли
        trait NumericConversion[N1, N2] {
          def convert(a: N1): N2
        }
        Ответить
        • Да, да, просто его так по всему коду раскидало, что сразу все в кучу и не соберешь.
          Ответить
    • >даже кушать не могу
      На этом ресурсе уже есть человек с подобной патологией. Вам обоим нужно срочно обратиться к специалисту.
      Ответить
    • У меня работают банальные views между числовыми типами
      def simpleCompare[N1 <% Double, N2 <% Double](a: N1, b: N2): Int = {
        if (a == b) 0
        else if (a < b) -1
        else 1
      }

      Я чего-то не понимаю?

      http://lmazy.verrech.net/wp-content/uploads/2011/02/scala_type_hierarchy.png
      Ответить
      • Бигинт и бигдецимал в пролете.
        Ответить
        • Из практических соображений я бы их и не стал сюда лепить, но если речь идет об академическом интересе, то могу добавить, что также будут в пролете и любые пользовательские числовые типы. Для этих случаев придется делать implicits, но мне кажется, что это будет все равно проще, чем то, что вы запостили.
          Ответить
          • Ну вот положа руку на серце: когда вы в последний раз создавали пользовательский чисельный тип? Или даже так: когда у вас в последний раз возникало такое желание?
            Вот что да скорее всего произойдет, так это через пару лет все прогрессивное человечество перейдет на 128-битные системы и тогда на короткий промежуток времени кто-то вспомнит о том, как неплохо было бы все-таки абстрагировать математику от физических возможностей оборудования, а потом, как всегда, появится новая побрякушка, типа Явы под еще большим слоем штукатурки, и все успокоятся и будут использовать какие-нибудь SuperLong MegaLong и т.п.
            Ответить
            • Последний раз чисельный тип создавал, когда писал арифметику на натуральных числах на JS без использования встроенного числового типа и арифметических операторов (как nat в Coq http://coq.inria.fr/library/Coq.Init.Datatypes.html), примерно пару месяцев назад, когда объяснял что-то коллеге.

              Кроме того, я об этом и говорил - это почти не нужно на практике, интерес чисто академический.

              В остальном я ответил - implicits.
              Ответить
              • Ну так почему бы в стандартной библиотеке не сделать сразу по человечески тогда? Получается куча невнятного никому не интересного кода, который нужно писать для того, чтобы числа сравнивать. Такое еще можно понять, если бы язык был низкоуровневый, где за каждый байт удавятся. А тут жеж куча временных объектов / левых функций неявно создается и т.п. Нашли на чем экономить.
                Ответить
                • По-человечески в стандартной библиотеке сделаны Views между основными числовыми типами языка. В остальном ваши претензии напоминают мне басню "Мартышка и очки", поскольку я не считаю большой необходимостью сравнивать числа разных типов при помощи одного волшебного метода - в подавляющем большинстве задач достаточно просто приводить все к наиболее общему типу, будь то Double или BigInteger.
                  Ответить
                  • Каким боком BigInteger не основной тип? Он всю жизнь провел в стандартной библиотеке. Оператор > для него в Скале определен. Они что его создали и тут же забыли?

                    Как раз таки в подавляющем большинстве случаев меня абсолютно не колышит сколько там байтов помещается в какое число. Нужно будет оптимизировать? - окей, я заинтересуюсь, а для того, чтобы написать функцию для, например, подстановки чисел в шаблоны сиквел запросов - ну есть все-таки дела по-важнее.
                    Ответить
                    • >Каким боком BigInteger не основной тип?
                      Я его так называю просто по определению, потому что он не включен в указанную иерархию views. Вы называйте как вам будет угодно.

                      >Как раз таки в подавляющем большинстве случаев меня абсолютно не колышит сколько там байтов помещается в какое число.
                      Так используйте всегда BigInteger/BigDecimal, приводя все остальное. Проблема высосана из пальца, поэтому у нее и нет "стандартного" решения.

                      Пойдите пожалуйтесь производителям мотоциклов, что двух колес не хватает для устойчивости.
                      Ответить
                      • Как вы это не понимаете: я не хочу ничего ни к чему приводить потому что это тривиальная операция, которую язык высокого уровня со стандартной библиотекой, ну уж в 21-м веке должен уметь делать. А то, что я не могу написать какой-нибудь банальный метод, который бы, например, делал сортированый инсерт в массив для всех численых типов без того, чтобы сидеть со справочником и выяснять какое из чисел в стандартной библиотеке включили в численный тип, а какое нет - это ж пиздец.
                        Т.е. вот как Оракл написали свой Number в отместку стандарному явовскому - так и мне прийдется изгалятся и писать заменитель скаловскому Number потому что родной - некондиционный. А потом, естесственно, в другой библиотеке окажется другой Number, и они будут несовместимы и понеслась, фасады, декораторы, адапторы и т.п.
                        Но самое обидное в этом то, что человек жеж не совсем идиот: перед ним уже были языки в которых все было правильно сделано. Ну возьми да скопируй! Нет, надо было какую-то херню придумать.
                        Ответить
                        • > я не хочу ничего ни к чему приводить
                          Я @wvxvw, я не хочу ничего ни к чему приводить, я хочу трололо
                          Ответить
            • > когда вы в последний раз создавали пользовательский чисельный тип?

              Ну я. Fixed 16:16 был нужен. Для с

              > SuperLong MegaLong

              Эти крестоблядские long long long должны сдохнуть, должны остаться int32,int64,int128...
              Ответить
              • Меня вообще бесит неопределённость размера чисел, с которыми я работаю. Нахрена это надо? Чтобы не писать переносимый код?
                В жабе правильно сделали, все размеры зафиксировали. В Go тоже все числовые типы фиксированы и называются int32, int64, uint32, uint64, float32, float64, etc.
                Ответить
                • cstdint?
                  Ответить
                  • Появившийся только в c++11? Спасибо, самое время.
                    Ответить
                    • вообще то C99
                      ну и boost/cstdint.hpp - появился явно раньше, чем ты вообще начал активно писать на с++, да так, чтобы тебе уже надоело implementation-dependent
                      Ответить
                      • Про boost/cstdint я знаю, но получается, что я должен тянуть буст или копипастить этот файл к себе в проект, даже если мне нужны только определения числовых типов.
                        Ответить
                        • в наших не современных проектах (32-разрядные) тащатся за собой простейшие настройки вида
                          typedef unsigned char u08;
                          typedef unsigned short u16;
                          typedef unsigned long u32;
                          по сути дела, этих трёх строчек хватает на почти всё, что связано с четким заданием длин
                          если внезапно какая экзотическая платформа, для нее просто напросто передефайнивалось что нужно (тут возможны только подбор int/long под 32 бита - на моей памяти таких прецендентов не было)
                          да, не было стандартного заголовка, ну так настоящих индейцев это не должно останавливать
                          Ответить
                • >я вообще бесит неопределённость размера чисел, с которыми я работаю.
                  Неистово плюсую Заебало это. Сишка - говно.
                  >В жабе правильно сделали
                  Но не до конца. Унификацию надо было.

                  >int32, int64, uint32, uint64, float32, float64
                  Архиверно. Если делаешь кроссплатформенный ассемблер, то стоит делать именно так.
                  Более того я бы вообще расширил. Целые типы вообще любого размера . Назвал бы так
                  i1,i2,i3..i8,...i16,..,i1024
                  ui1,ui2,ui3..ui8,...ui16,..ui1024
                  Флоаты только f16,f32,f64,f128 - согласно IEEE 754.
                  Целые можно объединять в особые массивы с которыми производятся групповые операции.
                  Компилятор сам решает как их выполнять (цикл, развернутый цикл, специнструкции).
                  Также можно кастить i8x4=i32. Никаких наркоманских скобок для каста, только функция cast(type,val) и так везде - практически всё функции.
                  Джва года жду такой язык.
                  Ответить
                  • домики деревянные набигают солдаты дворца и злодеи
                    Ответить
                    • Тарас фудаментально прав что сишкоблядские языки - нелогичное рудиментарное говно, которое неудобно ни разработчику компиляторов, ни программисту, ни изучающему студенту.
                      Единственное что их держит - традиции, распространн`ность и костыли.

                      И давно пора, взять с них самые ценные находки синтаксиса, убрать лишнее и отправить на свалку, потому что часто на асме проще писать.
                      Какой же это ЯВУ?
                      Ответить
                      • если тебе часто требуется писать на асме, то что-то ты делаешь неправильно
                        чем выше уровень языка, тем на большие компромиссы по быстродействию придется пойти ради удобства и скорости разработки приемлемого качества
                        приемлемое качество - это не падает у заказчика и выполняется с заданными критериями скорости, удобно сопровождать и дорабатывать
                        байтоёбство хорошо только для развлечений
                        Ответить
                        • Сишка совсем не приспособлена под реалии современных процессоров.
                          Она разрабатывалась для PDP-7, с тех пор всё сильно поменялось.

                          >если тебе часто требуется писать на асме
                          Нужен нормальный, высокоуровневый, портируемый асм. А не иллюзия оного.
                          Ответить
                          • > Она разрабатывалась для PDP-7
                            Ну да, отсюда, кстати, и строки с ноликом в конце.
                            Ответить
                            • Я уже кажись давал эту ссылку.
                              http://blog.llvm.org/2011/05/what-every-c-programmer-should-know_21.html
                              Повторение не будет лишним.
                              Ответить
                              • Что-то не заходит
                                Ответить
                                • Куки почисти.
                                  Ответить
                                • рашкопроблемы. У нас ЕМНИП огорожена часть блоггера из-за постановления какого-то мухосранского суда. Через i2p все работает.
                                  Ответить
                                  • Пора покупать трактор...
                                    Ответить
                                  • >Через i2p все работает.
                                    А кеш поисковика или транслате разве не показывает?
                                    Ответить
                  • > Целые типы вообще любого размера . Назвал бы так
                    i1,i2,i3..i8,...i16,..,i1024
                    IL от LLVM. Там насколько помню так и есть.
                    Ответить
                    • Ну да. Чистый кроссплатформенный ассемблер.
                      Но я думал об таком коротком нейминге задолго до того как познакомился с LLVM.
                      Ответить
                  • > Но не до конца. Унификацию надо было.
                    Унификацию?
                    Ответить
              • *Fixed мне был нужен для скорости
                Ответить
                • только сделал его не ты
                  кстати, что тебя остановило?
                  Ответить
                  • 100500 операторов надо руками писать, вдруг забуду.
                    Ну какого хуя "+" не определяется автоматом из "+=" ?
                    Ответить
                    • а если бы определялся, ты бы плакался, какого хуя оно по умолчанию определилось и как это теперь отключить
                      http://liveworkspace.org/code/1bfn3d$1
                      Ответить
                      • > а если бы определялся, ты бы плакался, какого хуя оно по умолчанию определилось

                        Схуяли лол
                        В Аде все операторы для жизни объекта автоматически определяются по трём методам, в сишке надо делать минимум 4, при этом кококонструктор кококопии по умолчанию некорректен (так как использует лишь копии членов), а конструктор сдвига - корректен (так как использует операторы объекта, а не его членов).

                        > и как это теперь отключить
                        Просто определить нужный оператор по-своему?

                        > http://liveworkspace.org/code/1bfn3d$1
                        Фу, бустятина...
                        Ответить
                        • конструктор сдвига?
                          Ответить
                          • "Оператор перемещения" больше устраивает?
                            Ответить
                            • т.е. ты о move ctor
                              что значит copy ctor по умолчанию некорректен?
                              для твоего (не твоего) fixed разве некорректно:
                              foo a(100), b(a);
                              Ответить
                              • Для std::string по умолчанию тупо копируется указатель, это корректно?
                                Ответить
                                • ну так для него и move ctor по умолчанию будет некорректен, что дальше то?
                                  Ответить
                                  • move ctor будет корректен, если описать всё, кроме него
                                    Ответить
                                    • неверно
                                      если всё описать, кроме него, то его не будет вообще
                                      If the definition of a class X does not explicitly declare a move constructor, one will be implicitly declared as defaulted if and only if
                                      — X does not have a user-declared copy constructor,
                                      — X does not have a user-declared copy assignment operator,
                                      — X does not have a user-declared move assignment operator,
                                      — X does not have a user-declared destructor, and
                                      — the move constructor would not be implicitly defined as deleted.
                                      Ответить
                                      • Кресты не нужны.
                                        Ответить
                                      • Как это не будет?
                                        При каких условиях вызывается movector? Если его не описывать, то что, в этих условиях вызовется ошибка компиляции?
                                        Или вызовется copyctor+dtor?
                                        Ответить
                                        • да, вызовется copy+dtor
                                          в т.ч. и потому что нужна совместимость с охулиардами кода, написанного под с++03

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

                                          как только ты объявляешь свой деструктор, или копи конструктор или всё остальное, что описано в списке - ты показываешь, что только силами членов класса не всё разруливается, нужны дополнительные действия а раз так - значит и мув конструктор будет плохо работающим, и притом, что он суть оптимизирующая поебень над копи конструктором, от него проще молча отказаться - создаст меньше проблем
                                          Ответить
                                          • > да, вызовется copy+dtor
                                            Дык это и значит считай, что "сгенерировался по умолчанию movector, корректный, но неоптимальный", то, что это в пункте 1.234 на странице 567 стандарта называется "movectorа нет", волнует только стандартоёбов, это уже придирка в буквам, а не сути, а суть в том, что поведение в случае необходимости перемещения по умолчанию всегда генерируется корректно, если вся остальная рожь определена, а вот поведение при необходимости копирования - нихуяшечки.
                                            Ответить
                                            • это значит, что вызовется copy вместо move
                                              специально для тебя строчкой ниже есть приписка:
                                              When the move constructor is not implicitly declared or explicitly supplied, expressions that otherwise would have invoked the move constructor may instead invoke a copy constructor.
                                              Ответить
                                              • Ты сейчас занимаешься буквоёбством.
                                                А суть не меняется.
                                                В сишке поведение при копировании по умолчанию не определяется даже когда его можно вывести (например, из оператора =), а поведение при перемещении - определяется.
                                                Ответить
                                                • о чем ты, конструктор копирования нельзя вывести из оператора =
                                                  конструктор это конструктор, заимствование значения из другого объекта - это другое
                                                  по мне так гораздо лучше понимать, что если я сам не объявлю, то компилятор за меня сделает понятную работу - почленный вызов
                                                  чем непонятную - на что он должен заменить operator = при конструировании? на вызов конструктора по умолчанию и присваивание?
                                                  Ответить
                                                  • > о чем ты, конструктор копирования нельзя вывести из оператора =

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

                                                    > на вызов конструктора по умолчанию и присваивание?

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

                                                        В Аде вместо copyctor делается
                                                        FieldCopy + Adjust
                                                        вместо = делается
                                                        Finalize + FieldCopy + Adjust

                                                        Поэтому вместо 4 методов (ctor,dtor,copyctor,=) в Аде достаточно описать только 3 (Initialize, Adjust, Finalize) и тогда гарантирована корректная реализация = и copyctor. Да, она зачастую неоптимальна, и то, что её нельзя оптимизировать - это недостаток языка, но 99% применения автообъектов - это всякая хренота, которую копировать нельзя вообще.
                                                        Ответить
                                                        • только вот понимаешь в чем дело
                                                          я пишу копирующий конструктор и operator = раз в столетие
                                                          я серьезно, наверное один класс из сотни или реже требует что-нибудь эдакое
                                                          ты слишком преувеличиваешь трудозатраты на описание "лишних" 2 методов - описать то их нужно для 1% классов, а пенальти твоя ада даёт на 100% объектов, и оптимизировать это нельзя

                                                          но ты можешь продолжать плакаться о том, как несправедлив мир, что стёр пальцы в кровь и что на твоем маленьком мониторе не влезают крестоублюдочные конструкции
                                                          for (some_long_type_name::const_iterator i = some_long_begin_iterator(arguments); i != some_long_end_iterator(); ++i) { ...
                                                          но это всё тщетно, смирись с величием С++ пред лицом ничтожных язычишек, как упомянутая тут всуе ада
                                                          Ответить
                                                          • > наверное один класс из сотни или реже требует что-нибудь эдакое

                                                            Любой класс с нетривиальным деструктором требует их написания. Лю-бой.
                                                            Даже просто объявить в привате без тела - и то надо.

                                                            > а пенальти твоя ада даёт на 100% объектов

                                                            Нет, только на подликах.
                                                            И возьмём ту же реализацию строк. По сравнению с крестами пенальти будет только в одном, ровно одному случае - если и новая строка, и старая имеют одинаковую длину - не надо подёргивать кучу.
                                                            Ответить
                                                            • > Любой класс с нетривиальным деструктором требует их написания.
                                                              Вот у меня в последнем проекте нетривиальный деструктор только в одном классе из 50+. Я что-то делаю не так?

                                                              А раз тебе нужны нетривиальные деструкторы - то в 99% случаев либо ты юзаешь хардкорные сырые указатели, либо твой класс имеет non-copyable семантику, и copyctor и = достаточно заблочить.
                                                              Ответить
                                                              • > либо твой класс имеет non-copyable семантику

                                                                И тогда всё равно я должен писать эту рожь
                                                                Ответить
                                                                • да какую рожь то?
                                                                  http://www.boost.org/doc/libs/1_53_0/boost/noncopyable.hpp
                                                                  напиши свой такой же класс да наследуйся от него везде, где надо

                                                                  мало того, что писать придется немного, так еще и всем понятно будет при первом взгляде на шапку класса, чем лезть в дебри private и искать отключенные конструкторы
                                                                  Ответить
                                                                  • > напиши свой такой же класс
                                                                    >> TarasB: Скопируй то, скопируй сё, из коробки должны быть эти вещи.
                                                                    Ответить
                                                                    • у меня они и есть из коробки - коробка называется boost
                                                                      просто у тарасика аллергия, он же велогонщик
                                                                      его "орлёнок" до сих пор в отличном состоянии
                                                                      Ответить
                                                                      • > коробка называется boost
                                                                        Это не коробка, это ящик Пандоры.

                                                                        P.S. Когда там уже boost::logging протащат...
                                                                        Ответить
                                                                        • а, вы там филиал ветки открыли, я и не заметил
                                                                          Ответить
                                                                        • > boost::logging
                                                                          который из?
                                                                          Ответить
                                                                          • > который из?
                                                                            Любой из двух, лишь бы довели до ума и "стандартизировали". Я их пока не изучал, если честно.
                                                                            Ответить
                                                                            • глянул Boost.Log Andrey Semashev
                                                                              свой костыль пока что ближе к телу
                                                                              да и проблему многопоточного смешивания логов он тут как то отдельно вынес, хотя это должна быть core feature
                                                                              в общем пробовать пока не сильно охота
                                                                              Ответить
                                                                      • Какой "орлёнок"?
                                                                        Ответить
                                                          • >крестоублюдочные конструкции
                                                            Заметь, это ты сам сказал.
                                                            Ответить
                                          • >да, вызовется copy+dtor
                                            Да ладно, с чего это вдруг деструктор вызывается при movector?
                                            http://liveworkspace.org/code/3xXuhg$0
                                            Ответить
                                            • всё по честному
                                              именно поэтому в примерах зануляется что надо в перемещенном объекте, чтобы деструктор ничего не запортил
                                              Ответить
                          • сдвига по фазе
                            Ответить
                        • > Фу, бустятина...
                          Ням-ням, свежая бустятинка.

                          > кококонструктор кококопии по умолчанию некорректен
                          Если все члены с кокосемантикой кокозначений, то вполне кококорректен.
                          Ответить
                          • некококорректен

                            ps: Ой, нитуда написал и вообще кокококмента борманда не заметил
                            Ответить
                          • А если нет?
                            Ответить
                            • > А если нет?
                              То кококопишешь кококорректную кококоверсию кококосам.
                              Ответить
                              • Вот именно, что всё через кококо в этой крестоблядских крестах, лишней писанины много. В Аде меньше, в Аде сделано всё, чтобы определить все операции через минимальное число методов. Если бы её делали сейчас, то из неё бы выкинули ещё и Initialize, ибо нахера объявлять переменную без первого присваивания, это признак императивного говноязыка.
                                Ответить
                                • > лишней писанины много
                                  Ну вот сколько у тебя в проекте классов, которым действительно нужны недефолтные оператор копирования и конструктор копий?

                                  Из моего опыта:
                                  1) Часть классов некопируема в принципе (виджеты, потоки, всякая ерунда, связанная с сокетами). У них эти операторы не только не нужны, но и вредны. А поэтому тупо заблочены путем их выноса в приват (макросом НОНКОПИЕЙБЛ или руками).
                                  2) Другая часть классов имеет семантику значений, и все их члены тоже имеют такую семантику. В таких случаях ничего писать не нужно, дефолтовые реализации справятся.
                                  3) И очень-очень небольшой части классов реально нужны эти операторы. Как правило это низкоуровневая поебень, содержащая сырые указатели.

                                  Если у тебя очень много классов попадающих в категорию 3, то задумайся, скорее всего ты что-то делаешь не так...
                                  Ответить
                                  • > НОНКОПИЕЙБЛ или руками
                                    т.е. третий вариант рулит - и писать мало, и не макрос
                                    Ответить
                                  • У меня много классов в категории 1, и даже просто описывать эти два метода - это тупорылая бесполезная работа, в Аде её нет.
                                    Ответить
                                    • > даже просто описывать эти два метода - это тупорылая бесполезная работа
                                      Можешь вот отсюда спиздить класс: http://www.boost.org/doc/libs/1_53_0/libs/utility/utility.htm#Class_noncopyable.
                                      Ответить
                                      • Скопируй то, скопируй сё, из коробки должны быть эти вещи.
                                        Ответить
                                        • > из коробки
                                          Так подключи коробку с бустом. В ней дохрена вещей, которые так или иначе пришлось бы велосипедить. Меня, например, на днях очень порадовало дерево свойств с поддержкой json.

                                          P.S. Там полно header-only компонентов, которые можно подключать даже не собирая бустолиб под целевую платформу.

                                          P.P.S. Почему пишу "скопируй"? Да тупо потому, что иначе ты скажешь "нахуй мне тащить весь буст в мой уютненький крестоблядский проектик".
                                          Ответить
                                          • > Так подключи коробку с бустом
                                            Нахуй мне подключать этот ужасный буст в мой уютненький крестоблядский проектик?
                                            Ответить
                                            • > Нахуй мне подключать этот ужасный буст в мой уютненький крестоблядский проектик?
                                              Чтобы не писать велосипеды ;)

                                              P.S. Без буста\кутишки\каких-то других либ\своих велосипедов кресты совершенно неюзабельны. Стандартной либы хватит разве что на написание лаб, да и то не всегда...
                                              Ответить
                                            • К теме о деструкторах могу посоветовать покурить про:
                                              1) смартпоинтеры: http://www.boost.org/doc/libs/1_53_0/libs/smart_ptr/smart_ptr.htm.
                                              2) контейнеры для указателей:http://www.boost.org/doc/libs/1_53_0/libs/ptr_container/doc/ptr_container.html

                                              Это, во многих случаях, позволяет избавиться от деструкторов.
                                              Ответить
                                • Where is your godada now?
                                  Ответить
              • >>должны остаться int32,int64,int128...
                И тут внезапно широкое распространение получают троичные компьютеры и какой-нибудь g+++ 6.0 захихикает: "какой у тебя int короткий!" в палитре не хватает бледно-зеленого
                Ответить
                • Тогда как в Аде - через указание минимума и максимума для типа.
                  Ответить
      • >if (a == b) 0
        Приводить к доблу, а потом сравнивать на равенство? Наркоман в треде.

        А BigInteger ты как к доблу приведешь? С сохраниением лишь порядков? Для больших чисел это работать не будет. Будешь сравнивать порядки, но не сами данные и так после приведения большее число вполне может стать меньшим. Куллстори
        Ответить
        • Там нет явного приведения вообще, там верхняя граница типов. Приведение произойдет на основании используемого view: если будет два Int, то ничего вообще не приведется, и будут сравниваться два Int. Если будет Int и Double, Int приведется к Double.

          BigInteger не приведется к Double, потому что его вообще нельзя передать в эту функцию - он не удовлетворяет условию верхней границе типов.

          Пожалуйста, ознакомьтесь с документацией перед тем, как сказать очередную глупость.
          Ответить
          • >BigInteger не приведется к Double, потому что его вообще нельзя передать в эту функцию - он не удовлетворяет условию верхней границе типов.
            Я о том же. Я о методологии.
            Ответить
          • > Приведение произойдет на основании используемого view: если будет два Int, то ничего вообще не приведется
            А почему так?
            Ответить
            • Компилятор подберет самый точный implicit из доступных.
              http://docs.scala-lang.org/tutorials/tour/views.html
              Ответить
    • Busted!
      http://stackoverflow.com/q/15735352/484666
      Ответить
      • И, если вы не заметили, это как бы мой пост. В этом есть что-то странное?
        Ответить
        • Я именно поэтому и запостил ссылку сюда.

          Добрый вы человек: выбрали лучший ответ и код из этого ответа запостили на говнокод.
          Ответить
          • Так отвечающий как бы не виноват, виноват Мартин Одерски - это его идея была испохабить ОКамл явовскими недоразумениями.
            Ответить
            • Можно подробнее про влияние Ocaml? Впервые слышу упоминание об этом.
              http://www.artima.com/weblogs/viewpost.jsp?thread=163733
              Ответить
              • Найдите бумагу подписаную вышеупомнянутым автором под названием Scalable Components Abstraction - там автор недвусмысленно признается в том, откуда ноги растут.
                Ответить
    • да, генерики это вам здесь не сраные крестоблядские темплейты, тут думать надо
      Ответить
      • Тут как раз не надо - тут конпелятор думает. А ты сидишь себе, пишешь код без ошибок типизации.
        Ответить
        • многовато приходится писать
          пусть компилятор самостоятельно подберет operator < для обоих аргументов исходя из их возможностей
          Ответить
          • собственно, на глупых темплейтах всё запишется крайне сложно и непонятно
            http://liveworkspace.org/code/gEOrP$0
            совсем непохоже на то, что хотел от скалы ОП
            Ответить
            • "Глупые" темплейты генерят код на каждое инстанциирование. Кроме того, их невозможно сделать виртуальными, т. к. не будет заранее известен размер таблицы виртуальных функций.
              Что, в прочем, никак не умаляет их огромной практической ценности.
              Ответить
              • собсно я это всё в первом посте и описал
                перенос duck typing, adl и прочие темплейтные обыденности в рантайм сулит много геморроя
                Ответить
              • > "Глупые" темплейты генерят код на каждое инстанциирование.
                Если этот "глупый" темплейт раскрыватся в пару-тройку асмокоманд, то это инстанциирование будет плюсом ;)
                Ответить
              • >"Глупые" темплейты генерят код на каждое инстанциирование.
                Оно все заинлайнится, если нужно и никто не заметит
                Ответить
          • Компилятор самостоятельно подбирает при помощи views. http://govnokod.ru/12836#comment173754
            Ответить
    • > Скала, сравниваем два числа.
      Ну уж не надо утрировать. Строго говоря, в функциональных языках нельзя сравнить два числа разных типов. На это даже крестокомпилятор кресторугаться крестоворнингами будет. Нужно привести к одному типу. Scala тут не при чём.
      А чувак на стековерфлоу объелся имплиситных функциональных грибов.
      Ответить
      • >в функциональных языках
        мне кажется, следует сказать "в строго типизируемых"
        Ответить
      • Ни то ни другое в корне не верно. Это, блин, SICP, где-то в первых разделах описывается, хрестоматийный пример. Функциональность языков тут ни при чем. Почему-то в Схеме функциональность не помешала сравнить два разных числа, а тут лепят высосаные из пальца причины.
        Ответить
        • А как там решено? Работает из-за динамической типизации? К чему приводится все внутри (ведь от этого зависит результат операции)?
          Ответить
          • В примере из книжки просто создаются функции специализирующиеся на разных типах + генерик функция с чем-то по сути являющимся таблицей в которой описываются соответствия между комбинациями типов и функцией которую нужно вызвать при этой комбинации. Генерик функции возможны потому, что в языке нет не-объектов (типа как в Яве - int), поэтому в родовую функцию можно передать что угодно, а она уже будет разбираться совпали типы, или нет. Это, конечно с одной стороны не удобно тем, что ошибки несоответствия типов откладываются до рантайма (или нужен компилятор умеющий выводить типы), с другой стороны такой вот несуразицы легче избежать.
            Ответить
        • > SICP, где-то в первых разделах описывается, хрестоматийный пример
          Если вы запамятовали, я вам напомню: в SICP как раз описывается построение таблицы runtime-преобразований (coersions), которые сначала приводят аргументы к общему типу, а затем уже выполняют обобщённую операцию. Но операции работают только над однотипными аргументами. Цитирую:
          This coercion scheme has many advantages over the method of defining explicit cross-type operations, as outlined above. Although we still need to write coercion procedures to relate the types (possibly n^2 procedures for a system with n types), we need to write only one procedure for each pair of types rather than a different procedure for each collection of types and each generic operation.*

          Собственно, примерно такую таблицу (только работающую в compile-time) и пытался вам построить советчик с SO, только нужды в ней в 99% случаев нет никакой. Ибо существуют преобразования, теряющие информацию при работе в обе стороны, и программисту лучше явно указывать, что именно он хочет получить.
          http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-18.html#%_sec_2.5
          Ответить

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