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

    −11

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    Point ReadPoint ()
    {
    	Fixed x = ReadFixed();
    	Fixed y = ReadFixed();
    	return Point(x,y);
    }

    Как же меня бесит отсутствие чётко определённого стандартом порядка вычисления аргументов!!!!!!!

    Запостил: TarasB, 17 Сентября 2013

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

    • Ну зато ты написал более понятный и очевидный код, пусть и в 3 строчки, имхо.
      Ответить
    • очевидно, здесь должна была быть ваша реклама стоило выбрать c++ way с потоками
      Ответить
      • Необязательно. Если в ReadFixed идет чтение из консоли, то возможно там обработка неверных входных данных и предложение ввести данные заново в случае некорректного ввода.
        Ответить
        • > Если в ReadFixed идет чтение из консоли
          Это же Тарас, наверняка карты уровней/сохранения/текстуры из файлов вычитывает.
          Ответить
      • Если ты имел в виду - перегрузить >> для Fixed и потока ввода, то согласен.:)
        Ответить
        • Ну тогда можно пойти дальше, и перегрузить его для Point, для Polygon, для Mesh и чего там дальше по уровню ;)
          Ответить
      • Point p;
        p<<ReadFixed()<<ReadFixed();
        return p;
        что ли?
        Ответить
        • нед
          fixed x, y;
          in << x << y;
          return point(x, y);
          Ответить
          • > in << x << y;

            О боже, дефекейт не в ту сторону стрелочки нарисовал! Вот что жаба с людьми делает!
            Ответить
          • Ну и радости то, считывание лишь в одну строчку записалось, а так та же фигня с лишними переменными, та же фигня с необходимостью заводить новый блок, если это в ветке свича, короче экономии мало.
            Ответить
            • а для трех членов - уже экономия, например
              но дело не в этом
              объекту не важно откуда его читают (это обеспечит тебе std::istream)
              зато ему важно, чтобы он сам контролировал своё состояние и целостность (это обеспечит тебе его же член класса fixed, point и т.д.)

              захочешь потом читать число не из файла, а из памяти, например (принял xml из сети) - будешь писать новую функцию ReadFixed()?
              Ответить
              • > а для трех членов одного типа - уже экономия, например
                поправил

                case SHAPE_RECT :
                {
                	Point c = GetPoint();
                	tbphys::Mass m = GetMass();
                	Fixed x = std::max(fxt(1), std::min(Fixed(100), GetFixed()));
                	Fixed y = std::max(fxt(1), std::min(Fixed(100), GetFixed()));
                	tbal::Color cl = GetColor();
                	int h = GetInt();
                	cur_id = CreateRectBrick(c,m,x,y,cl,h);
                }
                break;

                как спасёт твой способ?
                Ответить
                • так и спасёт
                  CreateRectBrick - это что? видимо, нечто, отдающее объект RectBrick
                  этому объекту виднее, как он хранится, как ему сериализоваться и десериализоваться
                  case SHAPE_RECT:
                      cur_id = rectum_brick::from_stream(in);
                  // ...
                  
                  class rectum_brick {
                      // ...
                      static rectum_brick from_stream(std::istream & is) {
                          point c;
                          fixed x, y;
                          color cl;
                          mass m;
                          unsigned h;
                          in >> c >> m >> x >> y >> cl >> h;
                          return rectum_brick(c, m, x, y, cl, h);
                      }
                      // ....
                  };
                  Ответить
                  • Тащить это в класс... Хм, ну наверное...
                    Ответить
                    • https://github.com/MysticTreeGames/Boost-for-Android
                      template<class Archive>
                      void serialize(Archive & ar, unsigned version) {
                          ar  & center_ 
                              & x_ & y_
                              & color_
                              & mass_
                              & height_;
                      }
                      Ответить
                      • Да только это не поможет, потому что sizeX,sizeY - это не поля, которые хранятся внутри класса, это числа для инициализации, которые потом забываются.
                        Сериализация есть, работает совсем иначе.
                        Ответить
                        • в чем отличие (де)сериализации и загрузки объекта из сейва?
                          Ответить
                          • Данные для первичной генерации берутся из текстового файла.
                            Данные для загрузки бинарные и содержат совсем другую информацию, храняющую именно текущее состояние.
                            Ответить
              • > это обеспечит тебе std::istream
                Трабла в том, что стрелки для всяких int'ов перегружены под текстовый ввод-вывод. И придется либо пилить свой базовый класс для бинарных стримов (например как обертку над istream), либо обертки для примитивов...
                Ответить
                • можно даже реализовать свой фасет, типа num_get
                  но для задачи сериализации/десериализации я бы не стал вообще уже велосипед изобретать - boost::archive
                  польза в том, что правила сериализации/десериализации можно описать один раз, ну и то, что ты хочешь - boost::archive::binary_i(o)archive - есть в коробке
                  Ответить
            • > в ветке свича
              Везет Тарасу, его еще не поразило ООП головного мозга.
              Ответить
              • В ооп что не паттерн - то либо синглтон либо свитч
                Ответить
                • В каких паттернах, помимо захардкоженных фабричных методов, есть свич? :)
                  Ответить
    • Не понял. Point(x,y); может вычислиться раньше Fixed y = ReadFixed(); ? Или Fixed y = ReadFixed(); раньше, чем Fixed x = ReadFixed(); ?
      Ответить
      • Не, код в топике нормальный, рабочий. А Тарас вот такой, видимо, написал сначала:
        Point ReadPoint ()
        {
        	return Point(ReadFixed(), ReadFixed());
        }
        И он у него читал числа в каком-попало порядке. У крестокомпилятора слишком много свободы ;(
        Ответить
        • У шарпа компилятор тоже любит шалить, но это заметно только при паралелизме
          Ответить
          • > заметно только при паралелизме
            Параллелизм это отдельная тема. Там не только компилятор, но и процессор любит пошалить.

            Знание модели памяти твоего языка (если, конечно, это не си) спасет отца русского параллелизма.
            Ответить
          • У шарпа порядок фиксированный - слева направо.
            Ответить
            • а ты забавный. Нафига тогда там memoryBarrier ?
              Ответить
              • показать все, что скрытоА ты отстойный. Нужно, значит.
                Ответить
                • Вот поэтому ты никогда и не освоишь приличный язык
                  Ответить
              • Переупорядочиваться могут только несвязанные обращения к памяти. Где-то на эту тему было большое хорошее описание (правда на английском и о Си++).
                Ответить
                • >Переупорядочиваться могут только несвязанные обращения к памяти.

                  логично но в случае func(funca(),funcb()) порядок выполнения funca(),funcb() строго не определен. поэтому иногда нужно выносить и ставить барьер памяти
                  Ответить
          • А при параллелизме обычно бывает заментно кривизну рук... Либо просто ничего не заметно.
            Ответить
        • Не в каком попало, а с конца. Если функция объявлена как __cdecl (по умолчанию).
          Ответить
          • если будет оптимизация - например, часть аргументов полезут через регистры, или вовсе это барахло будет инлайниться вкупе с вызывающим кодом - то компилятор вправе хоть в шахматном порядке вычислять
            Ответить
            • У меня все чаще возникает желание написать книгу "Как забросить с++ за 21 день", в которой будут рассматриваться крестопроблемы и крестоспособы их кресторешения...
              Ответить
              • крестоспособы решения крестопроблем своим существованием порождают новые крестопроблемы, подлежащие кресторешению
                требуется многотомник по крестосмирению и крестопросветлению, 21 день слишком мало для этого
                Ответить
              • Хочется, конечно, иметь простой язык вроде сишки без сборки мусора с простой и прозрачной семантикой, внятным синтаксисом, строгой типизацией, хорошо спроектированной библиотекой и модульной системой. Без всяких там богомерзких ООП и многочасовых компиляций. Но таких небывает. Да если бы и был, то не взлетел бы.
                Ответить
                • Ты только что описал паскаль до его превращения в object pascal и delphi ;)
                  Ответить
                  • Да, паскаль был бы близок, но всё же это не то... Хотелось бы что-то вроде
                    import sys, array, io
                    
                    use array.Array
                    
                    def fill_fibs(a: Ref[Array[Int32, 10]]): Unit {
                      a(1), a(2) := 1, 1
                      for var i := 3; i <= array.size(a); i += 1 {
                        a(i) := a(i - 1) + a(i - 2)
                      }
                    }
                    
                    def main(): sys.RetCode {
                      var fibs: Array[Int32, 10]
                      fill_fibs(ref(fibs))
                      io.printf("fib(10): %d", fibs(10))
                      sys.Success
                    }
                    Ответить
                    • Array это не ООП случаем? ;)

                      З.Ы. Язык похож на питона проглотившего паскаль и си.
                      Ответить
                      • неа :) абстрактный тип же
                        от ООП нужна только парадигма "реализует интерфейс", и то желательно в виде, близком по духу к Haskell: не путём "наследования", а через отношение тип - семейство типов.
                        Ответить
                      • > питона проглотившего паскаль и си
                        и поужинавшего Go, Scala, Haskell и, возможно, Ocaml
                        Ответить
                    • Scala?
                      Ответить
                    • Что-то подобное видел в презентации Rust'a, но это скорее c + haskell.
                      Ответить
                    • запись цикла блядская
                      в остальном не понимаю только слово Unit, без него семантика обычная сишно-паскальная, только разве что множественный возврат
                      Ответить
                      • Unit это как void только Unit
                        объект типа "Нихрена"
                        присваивание лучше выглядит как
                        a(0) <- 1
                        только это не очень хорошо сочетается со всякими +=. Предложи свой вариант оформления цикла.
                        Ответить
                        • for (Range(3,High(a)) , \ i {
                          a(i) := a(i - 1) + a(i - 2); } );
                          Ответить
                          • ну с range понятно, только я бы записал
                            for var i in range(3, array.end(a))
                            а как быть с циклами, сохраняющими инвариант? сишный for неплохо выражает идею...
                            Ответить
                            • В смысле, сохраняющими инвариант?
                              А вооще я хочу изобрести язык, где запрещены любые циклы, кроме циклов по диапазону с границами, известными при компиляции.
                              Рекурсия и блокирующие операции тоже запрещены.
                              Это позволит любому участку кода при компиляции дать оценку времени выполнения.
                              Да, придётся делать дохрена уиелдов для записи любого алгоритма, надо, чтоб язык это поддерживал.
                              На основе этого языка написать ось, которая никогда не будет виснуть - ведь в ней WndProc будет ограничена по времени.
                              Только в ядре, конечно же, придётся разрешить циклы итд, ядро надо писать на другом языке. А вот все прикладные программы - в виде исходников на этом языке.
                              Эта ось будет многозадачно работать даже без потоков, правда, как красиво использовать возможности 4 ядер, я пока не могу придумать.
                              Ответить
                              • Изобретаешь real-time os? Они уже есть, некоторые работают на модели SCP ala Erlang.

                                по поводу инвариантов - цикл for не так уж плох, мы тут недавно с царём его обсуждали. for же по факту из трёх частей состоит: 1) установка инварианта 2) проверка инварианта 3) изменение состояния, потенциально влияющее на инвариант. Таким образом, тело цикла выполняется только в случае выполнения некого инварианта (типичный примеры - индекс массива находится в заданных рамках, нода списка не пуста, etc). Часто удобно видеть все три части вместе.
                                Ответить
                                • В 80% случаев for используется для диапазона.
                                  Для остальных можно оставить крестозапись.

                                  Модель Ерланга? Там используются операции гарантированного времени или костыль, называемый потоками?

                                  RealTime оси есть, я знаю, только дорогие. Неудивительно, что дорогие, и как сделать дешевле, даже не знаю толком.
                                  Винда не риалтайм, и иногда это оооочень заметно и просто пиздец бесит.
                                  Ответить
                              • <Рекурсия и блокирующие операции тоже запрещены.>

                                А как же тогда искать файлы? Первое, что пришло на ум.
                                Ответить
                                • Жопой об косяк.
                                  Ответить
                                  • По-моему, ты неадекватный. Но это твои проблемы. А вообще, ужасно обидно, когда человек, к которому ты питаешь симпатию, оказывается полным уродом.
                                    Ответить
                              • Это значит, что язык не будет Тюринг-полным, такие языки уже есть, Coq например.
                                Ответить
                                • Таки да, для нормальных языков проблема останова неразрешима.
                                  Ответить
                                • Тем не менее, на нём можно записать любой алгоритм, но работать он будет за несколько входов, между которыми сохраняется состояние.
                                  Ответить
                                  • Только вот описать ввод текста пользователем не получится, но если знать наперед весь ввод, тогда все окей.
                                    Ответить
                                    • Получится.
                                      Конечно, блокирующий ReadLn идёт нафиг, а вот событийно-оприентированный подход, как в Edit, уже проканает.
                                      Ответить
                                      • События тоже как-то нужно будет реализовывать... Можно будет просто свести к минимуму / найти что-то типа фиксед-поинт комбинатора для задач, где нельзя наперед знать время выполнения, но если совсем отказаться от решения таких задач - мы лишим себя возможности обрабатывать очень много полезной информации.
                                        Об этом есть интересная популярная книжка Хофстадтера: Гедель, Эшер, Бах, где он описывает как Рассел "избавился" от парадоксов в теории множест, но тем самым сделал ее неспособной решать настоящие проблемы. Вернее, думал, что избавился. Ну а Гедель, собственно, показал, что в любой системе такого типа парадоксы неизбежны.
                                        Ответить
                                        • События реализовать просто - приложения вообще будут состоять только из функции обработки события. Всю нагрузку по правильно реализованному бесконечному вызову события в цикле берёт на себя ось.

                                          > задач, где нельзя наперед знать время выполнения

                                          Нет таких задач. Дело в том, что любой алгоритм квантуется. То есть можно разбить на несколько (возможно, бесконечное число) действий
                                          SomeObject.NextIteration, каждое из которых имеет детерминированное время выполнения.

                                          А в MainHandler ты просто делаешь проверку, что если мы в данный момент недовыполнили такую-то задачу, то надо выполнить следующий квант её решения.
                                          Ответить
                                          • > возможно, бесконечное число
                                            Если оно будет бесконечным, то мы уже нарушили наше обещание отсутствия бесконечных циклов...
                                            Ответить
                                            • Ты нихуя не понял.

                                              Пример: программа-часы.
                                              Часы могут идти хоть вечность.

                                              Код программы:
                                              void Handler ()
                                              {
                                                  Time t = getTime();
                                                  DrawClock(t);
                                              }

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

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

                                                Чтобы это лучше понять:
                                                1. Попробуй почитать книжку о которой я говорил двумя постами раньше.
                                                2. Подумай, как ты реализуешь таймер без безконечного цикла.
                                                Ответить
                                                • 1. Ок
                                                  2. Подумай.
                                                  Ответить
                                                • > как ты реализуешь таймер без безконечного цикла
                                                  Таймеры в ТарасоОси будут реализованы на уровне ядра, где бесконечные циклы вполне разрешены. Вот и все решение.

                                                  А без минималистичного доверенного ядра, которое может делать все что угодно, задача не имеет решения ;) По крайней мере на текущем железе.
                                                  Ответить
                                                  • Ну так это и есть фиксед-поинт комбинатор.
                                                    Ответить
                                                    • > фиксед-поинт комбинатор
                                                      Ну в каком-то смысле да. Только с реализацией его извне, а не с помощью средств языка.
                                                      Ответить
                                          • > любой алгоритм квантуется
                                            Ага, вот только тот же BEAM (эрланговый рантайм) вполне справляется с этим квантованием на автомате. Текущий "поток" (в терминологии эрланга процесс) получает право сделать N редукций (вызовов функций), после чего он обязан отдать управление шедулеру. Циклов там вообще нет, поэтому повиснуть не делая редукции он не сможет. Простым, неблокирующим нативным функциям приписывается оценка в редукциях, в зависимости от времени их исполнения. Сложные или блокирующие нативные функции крутятся в отдельных сервисных потоках, не мешая основному планировщику.

                                            То, что ты изобретаешь, очень напоминает эту идею. Вот только ты издеваешься над программистом, заставляя делать квантование руками.
                                            Ответить
                                            • Да, желательно, чтоб компилятор умел квантовать.
                                              Или процессор, OH SHI-...
                                              Проблема только в том, что он может алгоритм порезать на части не совсем там, где тебе надо, поэтому привет 100500 проблем синхронизации и прочей фигни.
                                              Ответить
                                              • > проблем синхронизации
                                                В эрланге их кардинальным образом решили: "процессы" не могут иметь общей памяти. Вообще. Инфой они могут обмениваться только передавая месаги друг-другу.

                                                P.S. Вобщем покури эрланг, лишним не будет. Может какие-то идеи оттуда почерпнешь для себя.
                                                Ответить
                                                • Слишком радикально, хотя мой метод не лучше...
                                                  Ответить
                                                • > P.S. Вобщем покури эрланг, лишним не будет.

                                                  1. Тарас идёт на shootout и смотрит производительность эрланга.
                                                  2. Тарас печатает книгу по эрлангу и публично сжигает её.
                                                  Ответить
                                                  • > производительность эрланга
                                                    delay vs throughput... извечная проблема...

                                                    Большинство систем перекошено в сторону throughput, и поэтому совершенно не катят для реалтайма из-за конских и недетерминированных задержек (например квантом по 50мс в типичных осях).

                                                    Эрланг и реалтайм оси уменьшают delay, но за счет этого они медленней.

                                                    Выиграть и в том и в другом невозможно ;)
                                                    Ответить
                                                    • Ой вей, уже 4 ядра, а всё ещё вместо того, чтобы потратить их на rt, тратят на хуйню и жабу.
                                                      Ответить
                                                  • Я хз, что хуже - передача длинных сообщений, или сохранение больших состояний между возвратами к оси.
                                                    Хехе, можно ещё ввести оператор, который сохраняет состояние в специальную структуру (возвращает её ид), и возвращает управление системе (при этом в очередь сообщений запихивается MESSAGE_CONTINUE с параметром ид, чтобы можно было его схватить и продолжить выполнение). Тогда рекурсии и бесконечные циколы уже разрешены получаются. Но этот сахарок уже слишком приближает программу к классической говнопоточности.
                                                    Но без него даже удлинение строки в пиздец превращается.
                                                    Ответить
                                                    • > чтобы можно было его схватить и продолжить выполнение
                                                      Баян: call with current continuation в scheme, отчасти питоний yield, крестоблядский boost::context и boost::coroutine в конце концов :)

                                                      > классической говнопоточности
                                                      Классическая говнопоточность все-таки имеет плюс - последовательный алгоритм выглядит как последовательный алгоритм, а не как распидорашенная асинхронная кастрюля с лапшой.
                                                      Ответить
                                                      • > распидорашенная асинхронная кастрюля с лапшой.

                                                        Ну, это дело привычки, надо подождать, и народ проникнется же!

                                                        ...какое-то пидорко заботовало 16 раз...
                                                        Ответить
                                                        • > Ну, это дело привычки, надо подождать, и народ проникнется же!
                                                          К сожалению народ уже проникся... И эта кастрюля с лапшой называется NodeJS.

                                                          Кстати, взгляни на питонскую либу twisted. Вот где имхо асинхронщину красиво вывернули на изнанку. Там последовательный код неплохо смотрится. Емнип, добавляется только yield перед каждой "блокирующей" операцией.
                                                          Ответить
                                                      • >распидорашенная асинхронная кастрюля с лапшой.
                                                        Async руки, у кого нету - сосет.
                                                        Ответить
                                                        • > Async
                                                          Ну вот async/await в шарпе и yield в аналогичных целях в twisted'е, это таки кошерная асинхронщина, в которой линейный алгоритм выглядит линейно.

                                                          А вот тот же node.js - ебучая лапша.
                                                          Ответить
                                                      • > отчасти питоний yield
                                                        Елда тут не причем, в твистеде там елда с декоратором работает. И отдельное ключевое слово лично мне больше нравится.
                                                        Ответить
                                                    • Я все больше убеждаюсь, что тебе, как ценителю антиквариата очень бы понравился Оккам. Попробуй, Эрланг в какой-то степени свою арифметику процессов на нем основывает, вообще само по себе понятие арифметики процессов оттуда пришло. Кроме того, язык заточен для 8- и 16-битных систем, но при этом в нем встроены инструменты параллелизма на уровне семантики языка (Эрланговский ! оттуда, например).
                                                      Ответить
                                                      • Мне Оккам не понравился, анальный 31-битный инт и какой-то костыль для мутабельных вещей
                                                        а ещё пиздец, что есть разные операторы
                                                        +
                                                        и
                                                        +.
                                                        Ответить
                                                        • > Мне Оккам не понравился
                                                          > анальный 31-битный инт
                                                          > есть разные операторы

                                                          ты путаешь с Окамлом
                                                          Ответить
                                                          • Да, путаю.
                                                            Так это другой язык!
                                                            Интересно...
                                                            Ответить
                    • Похоже, я переоткрыл Clay о_О
                      https://github.com/jckarter/clay/wiki
                      Ответить
                • Forth.
                  Ответить
                  • > строгой типизацией
                    > хорошо спроектированной библиотекой
                    > модульной системой
                    > прозрачной семантикой
                    >> Forth.
                    /0
                    Ответить
                    • По сравнению с Си у меня как-то библиотека нареканий не вызвала. Хотя есть много атавизмов, но они просто атавизмы, а не идиотизмы. Семантика у Форта очень простая, однозначная, ничего не скрывающая. Си в этом отношении - просто бред укуренного третьекласника. Система что нинаесть модульная. Все слова можно при желани догрузить или переопределить.

                      Ну а типизации нет никакой. Если сильно хотелось строгую типизацию, то конечно Форт не подходит, но по сравению со всем остальным... ну, еще Оккам - интересный вариант, но он, на сколько я понимаю, остался только в книжках.
                      Ответить
                      • > Семантика у Форта очень простая, однозначная
                        Ага... ее просто нет... ибо вся семантика скрыта в словах. И каждое слово может иметь такую семантику, как хотелось его автору. Впрочем и синтаксиса тоже нет.
                        Ответить
                        • Мда... семантика - это то, что выражают конструкции языка. Т.е. в языке не может не быть семантики, т.как если бы ее не было, он бы ничего не выражал, т.е. просто белый шум. Но белый шум - это не язык. Поэтому такое утверждение бессмысленно.
                          Ответить
                          • Ну опишите семантику форта...

                            Форт и так не язык. Это конструктор для своих языков. Ну и набор стандартных слов, которые при желании можно выкинуть или переделать.
                            Ответить
                          • Да и какие там вообще конструкции языка кроме слов, которые могут делать что угодно, включая чтение и пропуск фрагментов исходника, тем самым добивая остатки синтаксиса.
                            Ответить
                            • Ну да, вот я прямо за пять минут сяду и напишу. Это труд на несколько месяцев минимум.
                              Для примеров того, как это делается / может выглядеть - все та же замечательная книжка Б. С. Пирса. Там он разбирает семантику очень простого языка (в котором есть 5 ключевых слов, цифры и ложь / истина). И это занимает три-четыре раздела в книжке. И это только один из подходов (он описывает операционную семантику).

                              http://books.google.co.il/books?id=ti6zoAC9Ph8C&lpg=PP1&pg=PA23#v= onepage&q&f=false
                              Ответить
                              • Ок, спасибо, почитаю на досуге.

                                Но насчет форта - ну да, можно описать семантику изкоробочного набора слов. Но дальше то язык можно менять как угодно ;)
                                Никаких специальных конструкций в форте нет. Даже кавычка это обычное слово (из-за чего приходится писать после нее пробел, что довольно некрасиво), и при желании можно ее переделать, прикрутив другой формат для хранения строк.
                                Ответить
                                • Вот эта ещё вроде неплоха
                                  http://www.amazon.com/exec/obidos/ASIN/0262201755/shelfari-20
                                  Ответить
                      • Кстати, синтаксис forth'а немного не доведен до совершенства. Надо убрать "особенность" числовых литералов, заменив их на слово, по аналогии со строковыми литералами. К примеру на #.
                        ( Было )
                        5 .
                        ( Стало )
                        # 5 .
                        Только слова, разделенные пробелами (и, иногда, отъедающие фрагмент исходника, стоящий за ними), только хардкор ;)
                        Ответить
                        • А для апофеоза нужно убрать специальность пробела. В самом деле, зачем каждое слово должно заканчиваться им? Концом слова будем считать однозначное совпадение с одним из слов в словаре. Это не даст одновременно описывать такие слова, как "foo" и "foobar", зато мы окончательно избавим язык от стесняющего его синтаксиса:
                          42 ( слово 4, съевшее двойку из исходника)
                          "test" ( слово ", съевшее test")
                          <пробел>  ( просто слово, которое ничего не делает, аля nop)
                          <cr или lf> ( тоже nop )
                          Ответить
                          • Кстати проблема с foo и foobar, по идее, тоже не возникнет. Ибо для читабельности после слова все равно будет стоять или пробел или возврат каретки. И тогда "foo " и "foobar " вполне однозначны. Проблемы будут только с поедающими исходник словами типа " или 5, но их не так много.

                            Запилить что-ли на досуге такой диалектик...
                            Ответить
                            • Можно поступить как в Лоджбане, если есть кластер согласных - значит селбри. Все селбри 5 букв в длину, шмевла могут быть 1 или 2 буквы в длину, но обязаны заканчиваться на гласную. Если слово не заканчивается на гласную - нужно писать точку. Ну и там еще немножко правил есть, но в принципе, можно писать без пробелов.
                              Ответить
                              • Да почему «лоджбан», если «ложбан»?! В фонетике языка явно написано, что j — это фрикативный согласный ʒ, а не аффриката dʒ.
                                Ответить
                • Go?
                  Ответить
                  • Go не подходит под описание из-за управляемого рантайма. Размещением объекта в памяти мы там практически не можем управлять. Хотя язык спроектирован очень даже неплохо, хоть и без женериков.
                    Хотелось бы именно замену сишке, чтобы лоулевел и никакой магии. Ассемблер высокого уровня с нормальной семантикой и без вагона костылей.
                    Ответить
                • Go не ?
                  Ответить
              • Вот если к нам прилетят инопланетяне и спросят, на чём мы пишем программы, что мы им покажем? C, C++, Java и Perl? Стыдно, товарищи...
                Ответить
          • > Не в каком попало, а с конца
            C++98, 5.2.2 Function call, пункт 8 гласит:
            The order of evaluation of arguments is unspecified. All side effects of argument expression evaluations take effect before the function is entered. The order of evaluation of the postfix expression and the argument expression list is unspecified.

            Так что нехуй полагаться на этот порядок, нехуй.

            > __cdecl (по умолчанию)
            На cdecl свет клином не сошелся. Особенно на таких платформах, как х86_64.
            Ответить
            • "The order of evaluation of [...] is unspecified."

              Типичная парадигма, которая в переводе на челевеческий означает: "мешает компилятору оптимизировать."

              Я когда-то находился по граблям порядка вызова конструкторов полей объекта. Вашу боль понимаю.
              Ответить
              • > порядка вызова конструкторов полей объекта
                O_o. А с ним то что не так? Емнип, порядок конструкторов-деструкторов очень строго расписан, без всяких undefined и unspecified.
                Ответить
                • Значит прогресс. Моя проблема (дело было в начале 2000х) была что GCC вызывал конструкторы в порядке как поля были объявлены, а один виндозный компилер (толи MSVC, толи Borland C++) вызывал в порядке как они были указаны после двоеточия в конструкторе. Подобно твоему примеру: везде было X,Y - а в одном месте было Y,X. Года три никто понять не мог почему.
                  Ответить
                  • > в порядке как поля были объявлены
                    > в порядке как они были указаны после двоеточия в конструкторе
                    На такое говно сейчас все адекватные компиляторы выдают ворнинг, уговаривая написать их в одинаковом порядке и в классе и в конструкторе ;) Что в общем-то решает проблему.
                    Ответить
                    • А что стандарт говорит? (Самому лень лезть читать. (Да и уже на третьем пиве.))
                      Ответить
                      • Вызывать в том порядке, как они были объявлены. А причина очень простая - в списках инициализации в конструкторе могут быть перечислены не все поля, несколько конструкторов могут инициализировать разные поля (да еще и в разном порядке, если программист любит рисковать). А деструктор один. В итоге непонятно в каком порядке разрушать поля.

                        Отсюда и решение: забить на порядок в конструкторах (и выдавать ворнинг, если он кривой), верить только порядку полей в классе.
                        Ответить
                        • О. Прикол вспомнил. Борланд в те времена (5й билдер?) вызывал дефолт конструкторы в *алфавитвом* порядке имен полей.
                          Ответить
                          • not bad
                            причем, очевидно, проблема легко могла быть не выявлена годами - когда в классе все поля Form1, Button5 и Label666
                            Ответить
                            • > когда в классе все поля Form1, Button5 и Label666
                              А списки инициализации в конструкторах девственно пусты?
                              Ответить
                          • > в *алфавитвом* порядке
                            Пиздец. Хотя код, зависящий от порядка исполнения дефолтных конструкторов\списка инициализации пиздец еще больший ;)

                            > 5й билдер
                            Его поди до стандарта писали... Ему простительно.
                            Ответить
                        • "А деструктор один. В итоге непонятно в каком порядке разрушать поля."

                          Ит ол мэйкс сэнс нау.
                          Ответить
        • Не, не в каком попало.
          Всегда в одном и том же.
          Студия всегда с конца, гцц всегда с начала.
          Ответить
          • > Всегда в одном и том же.
            А если опции оптимизации пощелкать? Или на x86_64 собрать? :)
            Ответить
            • Да, я погорячился, не всегда, а как правило.
              Ответить
              • too many words...
                Ответить
                • Too many dicks in your ass...
                  Ответить
                  • показать все, что скрытоПосмотри сюда:
                    * g o a t s e x * g o a t s e x * g o a t s e x *
                    g                                               g  
                    o /     \             \            /    \       o
                    a|       |             \          |      |      a
                    t|       `.             |         |       :     t
                    s`        |             |        \|       |     s
                    e \       | /       /  \\\   --__ \\       :    e
                    x  \      \/   _--~~          ~--__| \     |    x  
                    *   \      \_-~                    ~-_\    |    *
                    g    \_     \        _.--------.______\|   |    g
                    o      \     \______// _ ___ _ (_(__>  \   |    o
                    a       \   .  C ___)  _________ (_(____>  |  /    a
                    t       /\ |   C ____)/         \ (_____>  |_/     t
                    s      / /\|   C_____)          |  (___>   /  \    s
                    e     |   (   _C_____)\_________/  // _/ /     \   e
                    x     |    \  |__   \\____________// (__/       |  x
                    *    | \    \____)   `----   --'             |  *
                    g    |  \_          ___\       /_          _/ | g
                    o   |              /    |     |  \            | o
                    a   |             |    /       \  \           | a
                    t   |          / /    |         |  \           |t
                    s   |         / /      \__/\___/    |          |s
                    e  |           /        |    |       |         |e
                    x  |          |         |    |       |         |x
                    * g o a t s e x * g o a t s e x * g o a t s e x *

                    Это твой автопортрет.
                    Ответить
                    • показать все, что скрытоПосмотри сюда:
                      
                      * g o a t s e x * g o a t s e x * g o a t s e x *
                      g                                               g  
                      o /     \             \            /    \       o
                      a|       |             \          |      |      a
                      t|       `.             |         |       :     t
                      s`        |             |        \|       |     s
                      e \       | /       /  \\\   --__ \\       :    e
                      x  \      \/   _--~~          ~--__| \     |    x  
                      *   \      \_-~                    ~-_\    |    *
                      g    \_     \        _.--------.______\|   |    g
                      o      \     \______// _ ___ _ (_(__>  \   |    o
                      a       \   .  C ___)  _________ (_(____>  |  /    a
                      t       /\ |   C ____)/         \ (_____>  |_/     t
                      s      / /\|   C_____)          |  (___>   /  \    s
                      e     |   (   _C_____)\_________/  // _/ /     \   e
                      x     |    \  |__   \\____________// (__/       |  x
                      *    | \    \____)   `----   --'             |  *
                      g    |  \_          ___\       /_          _/ | g
                      o   |              /    |     |  \            | o
                      a   |             |    /       \  \           | a
                      t   |          / /    |         |  \           |t
                      s   |         / /      \__/\___/    |          |s
                      e  |           /        |    |       |         |e
                      x  |          |         |    |       |         |x
                      * g o a t s e x * g o a t s e x * g o a t s e x *
                      
                      

                      Это твой автопортрет.
                      Ответить
                      • Сам нарисовал распидорашенную жопу, сам назвал это автопортретом.
                        Значит жопа-то твоя, а, петушок?
                        Ответить
                        • показать все, что скрытоСнижай чсв, мальчик. А амбиции оставь девочкам.

                          Окей. что и требовалось доказать. 12 ботов, +-2. 12-ый плюс кто-то другой поставил.
                          Ответить
                          • Это ты к чему прокукарекало вооще?
                            Ответить
                            • показать все, что скрытоРазговаривай нормально, пожалуйста. Помни: я аноним без лица и без имени, а ты сам за себя, и никогда не забывай это.

                              Если ты такой разговорчивый, почему проигнорировал мое лс? я отправлял с [email protected]
                              Ответить
                              • > Помни: я аноним без лица и без имени

                                То есть ты говно пидорское, которое ссыт назвать себя?
                                Ответить
                                • показать все, что скрытоОбратите внимание, товарищи: чрезвычайно уязвимый индивид. Никакой защиты от троллинга.

                                  Что прикажете делать, троллить его дальше, или заткнуть? Вы жаждете зрелищ, я знаю..
                                  Ответить
                                  • Чучело, ты троллингом называешь публично корчить из себя придурка?
                                    Ответить
                                  • Stertor, может лучше вернуться к троллингу на других сайтах?
                                    Годные посты ведь были: http://govnokod.ru/13544

                                    И доставляющее "Можно заблокировать тролля, но нельзя забанить троллинг, ибо это не причина, а следствие.".

                                    А сраться с Тарасом и постить гоатсе - как минимум уныло.
                                    Ответить
                                    • Лично против него я ничего не имею. Он первый начал провоцировать меня, использовав ненолекс. Путь теперь имеет мужество перенести последствия.
                                      Ответить
                                    • procedure TForm1.Button1Click(Sender: TObject);
                                      var
                                        t:tmystr;
                                        i:integer;
                                        lst:tlist;
                                      begin
                                        lst:=threadlist.LockList;
                                        for i:=1 to 5 do    // по идее, должен добавиться только 1 экземпляр tmystr
                                        begin
                                          t:=tmystr.Create;
                                          t.param1:='param one';
                                          t.param2:='param two';
                                          t.param3:=inttostr(i);
                                          lst.Add(t); 
                                        end;
                                        threadlist.UnlockList;
                                      end;


                                      Дичайший быдлокод, что и говорить. Но я постоянно совершенствую свои познания в Делфи, особливо учитывая, что я самоучка.
                                      Ответить
                                    • это что, наш старпер иногда сам с собой срется в своих собственных постах
                                      Ответить
                                      • Это, кстати, плохая привычка, поскольку на почту не приходит уведомление. Вроде бы что-то тебе ответили, а информация об этом есть только в стоке.
                                        Ещё кое-кто любит сообщения редактировать. На почту приходит одно, отвечаешь уже на другое.
                                        Ответить
                                      • А ты в это время, должно быть, сидишь рядом и мнешь Стерперу член? Иначе как бы ты узнал, что "старпер сам с собой"?

                                        program Project2;
                                        
                                        {$APPTYPE CONSOLE}
                                        
                                        uses
                                           SysUtils,windows;
                                        
                                        begin
                                        windows.beep(600,40);
                                        windows.beep(480,40);
                                        windows.beep(600,40);
                                        windows.beep(600,40);
                                        windows.beep(480,40);
                                        windows.beep(600,40);
                                        windows.beep(600,40);
                                        windows.beep(480,40);
                                        windows.beep(600,40);
                                        windows.beep(600,40);
                                        windows.beep(480,40);
                                        windows.beep(600,40);
                                        windows.beep(600,40);
                                        windows.beep(480,40);
                                        windows.beep(600,40);
                                        sleep(200);
                                        windows.beep(600,40);
                                        windows.beep(480,40);
                                        windows.beep(600,40);
                                        windows.beep(600,40);
                                        windows.beep(480,40);
                                        windows.beep(600,40);
                                        windows.beep(600,40);
                                        windows.beep(480,40);
                                        windows.beep(600,40);
                                        windows.beep(600,40);
                                        windows.beep(480,40);
                                        windows.beep(600,40);
                                        windows.beep(600,40);
                                        windows.beep(480,40);
                                        windows.beep(600,40);
                                        sleep(1200);
                                        windows.beep(600,40);
                                        windows.beep(480,40);
                                        windows.beep(600,40);
                                        windows.beep(600,40);
                                        windows.beep(480,40);
                                        windows.beep(600,40);
                                        windows.beep(600,40);
                                        windows.beep(480,40);
                                        windows.beep(600,40);
                                        windows.beep(600,40);
                                        windows.beep(480,40);
                                        windows.beep(600,40);
                                        windows.beep(600,40);
                                        windows.beep(480,40);
                                        windows.beep(600,40);
                                        sleep(200);
                                        windows.beep(600,40);
                                        windows.beep(480,40);
                                        windows.beep(600,40);
                                        windows.beep(600,40);
                                        windows.beep(480,40);
                                        windows.beep(600,40);
                                        windows.beep(600,40);
                                        windows.beep(480,40);
                                        windows.beep(600,40);
                                        windows.beep(600,40);
                                        windows.beep(480,40);
                                        windows.beep(600,40);
                                        windows.beep(600,40);
                                        windows.beep(480,40);
                                        windows.beep(600,40);
                                        end.


                                        Подними уже трубку, мать твою.
                                        Ответить
    • показать все, что скрытоОТСОСУ НЕМЫТЫЙ ХУЙ У ГРЯЗНОГО ТАДЖИКА. СПРАШИВАТЬ ТАРАСА БЕРЕЗНЯКА [email protected]
      Ответить

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