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

    +64

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    XmlWriter<xhtml11::XHtmlDocument>(stream)
    <html
      <head
        <title
          <"Hello world!"
        >title
      >head
      <body
        <p
          <"Some nice paragraph text."
        >p
        <img(src="http://example.com/hello.jpg",alt="Hello")>img
      >body
    >html;

    кресты в квадрате. любителям темплейтов посвящается.

    http://www.vandenoever.info/blog/2015/07/05/literal-xml-in-c++.html

    Creating and processing XML feels awkward in most programming languages. With Blasien, a tiny C++11 header library, XML in C++ feels easy and natural. As an extra the XML that is written is mostly validated at compile time.

    Запостил: Dummy00001, 06 Июля 2015

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

    • где здесь С++?
      Ответить
      • Вполне себе на месте. Перегрузка операторов)))
        Ответить
        • ... я думаю что Her ссылается тот факт что после C++14, кресты на кресты больше не похожи.

          меня уже даже не удивит если кто на темплейтах/операторах/этц интерпретатор перла напишет...
          Ответить
          • В смысле "кресты на кресты не похожи".
            Смотрю на стандарт ++14 и жду не дождусь 2014 года... ОЧЁРТ
            Ответить
          • Ну тут вроде от 14 ничего не видно в коде.
            Ответить
    • Блин, а прогресс ведь, по сравнению с http://govnokod.ru/11549!
      Ответить
      • https://github.com/vandenoever/blasien - тут еще в тестах есть пара примеров.

        из всех извратных (полезных) извратов что видел, это наверное самый извратный.
        Ответить
    • Есть два вида шаблонизаторов: xslt и шаблонизаторы доля хуесоса. Этот относится ко второму виду.
      Ответить
    • После boost::spirit меня уже ничего не удивляет.
      Ответить
      • примерчик?
        Ответить
        • а вот и да
          http://www.boost.org/doc/libs/1_58_0/libs/spirit/doc/html/spirit/qi/tutorials/mini_xml___asts_.html
          Ответить
          • это я видел. сильно не впечатлило.

            но идея сама по себе интересная - перегружеными операторами дерево синтакса строить.
            Ответить
            • Это не дерево синтаксиса (что это вообще? аст?), а грамматика.
              Ответить
    • показать все, что скрытоЕбанутые создания. Второй перл.
      Ответить
    • троллейбус_из_хлеба.jpg
      Ответить
    • А вообще вполне себе симпатично. До тех пор, пока дебажить не пришлось...
      Ответить
    • > img(src="http://example.com/hello.jpg", alt="Hello")
      А что, так можно было? О_о
      Ответить
      • Уметь надо (это перегруженные операторы и глобалки alt и src, видимо).
        Ответить
        • > глобалки alt и src
          Интересно, а можно ли как-то извернуться и вогнать туда произвольные атрибуты, используя наиболее короткую запись.
          Приближения, которые приходят в голову:
          1. Конструктор от строки: запись $("src")="...", $("alt")="...." - 5 лишних символов на параметр
          2. Шаблонная использовать строки как отдельный параметр: "src", "...", "alt", "..." - 2 лишних символов на параметр + нельзя "="
          3. Макрос, который делает # своим нечётным аргументам: запись src, "...", alt, "..." - нельзя "="
          Ответить
          • 4. Какая-нибудь питушня с пользовательскими литералами - как №1, но скобки не нужны
            Ответить
          • Лирическое отступление:
            const char *src, *alt;
             
            void img()
            {
                printf("src=%s alt=%s\n", src, alt);
            }
             
            int main() {
                img(src="http://test.com", alt="goatse");
                return 0;
            }
            http://ideone.com/DC6cch
            Ответить
            • Ну вот! Ещё в Plain C были именованные параметры!
              Ответить
            • img(alt="http://test.com", src="goatse");
              Ответить
              • А всё нормально будет: у функции img ноль параметров, а все значения она берёт из глобальных переменных. Так что и такую возможность Борманд предусмотрел.
                Ответить
                • >>у функции img ноль параметров, а все значения она берёт из глобальных переменных.
                  капитан в треде
                  Ответить
              • исходники в жопе?
                perforce чтоль?
                Ответить
            • А как оно работает?
              Оператор запятая возвращает правый аргумент. Оператор присваивания возвращает const char* (goatse). Но функция ничего не принимает!
              Ответить
              • Это не «оператор запятая», а разделитель аргументов функции.

                Рассказать в деталях, как оно работает, или оставить в качестве домашнего задания?

                Подсказка: при соглашении cdecl стек чистится вызывающим кодом.
                Ответить
                • Не знал что можно предавать в функцию больше аргументов, чем она принимает. Лучше разъясни, похоже я опять не так понял.
                  Ответить
                  • в С, обявление `int f();` идентично `int f(...);`. функция `int f(void)` - не принимает аргументов, а без этого войда у функции нет ограничения на аргументы и их количество.
                    Ответить
                    • а я то думал пишут f(void) от нехуй делать
                      теперь понятно
                      Ответить
                      • Давно-давно,когда мы все еще не родились, а у некоторых даже и папы с мамами еще не родились, в сях нельзя было указывать аргументы в декларейшене функции.

                        Всё было на совести программиста, компилятор ничего не проверял.

                        Просто писали foo() и всё.

                        Когда ввели возможность указывать аргументы, то ради обратной совместимости сделали так:

                        1) foo() -- НЕИЗВЕСТНО какое аргументы (комплиятор может не проверять)
                        2) foo(void) --аргов точно нет.

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

                            собственно, ворнинги были еще в борланд си 1993го года:) (правда там был ключик "ANSI C" или "K&C", и вот в ANSI C были варнинги)

                            Ну вот вижалси до сих пор компилирует, но пишет ворнинги
                            https://msdn.microsoft.com/en-us/library/efx873ys.aspx

                            зы: может быть и напорица на что-то, я никогда не поддерживал код, написанный до 1989го года (или когда там вышли анси си)
                            Ответить
                        • Как можно получить внутри функции её аргумент?
                          void foo() {
                            printf("%d\n", ???);
                          }
                          foo(5);
                          Ответить
                          • Вероятно нужно знать call convention. Обычно аргумент будет или в стеке, или в регистре.
                            Обладая этим знанием можно его получить.

                            Еще есть va_arg, но я не знаю будет-ли он тут работать.

                            Но Борманд не получал аргументов, он юзал глобальные переменные
                            Ответить
                            • Пиздец. Нахуй тогда си нужен? Писали бы себе дальше на асме.
                              Ответить
                              • Что тебя так разозлило?
                                Ты хочешь сделать функцию с переменным числом аргументов?
                                Ну так юзай va_arg, только делай это явно, и будет тебе щастье.

                                Си нужен чтобы переносить низкоуровневый шлак между платформами (особенно между процессорами), ну и писать на нём всё таки проще, чем на асме.
                                Ответить
                                • Ты писал что раньше нельзя было указывать аргумент ты в декларейшине вункции. И я задался довольно helloworldным вопросом как передать в функцию 1 аргумент, а затем его прочитать. И не получил однозначного ответа.
                                  Ответить
                                  • Извини, я тебя не сразу понял.

                                    В дефинишене можно было указывать параметры, в декларейшене было не обязательно.

                                    причем в дефинишене они писались немного не так.

                                    // Pitushok.h:
                                    void kokoko()
                                    
                                    // Pitushok.c:
                                    void kokoko()
                                    int kurochka;
                                    {
                                    printf("koko %d", kurochka);
                                    }
                                    
                                    // haxor.c
                                    #include "Pitushok.h"
                                    
                                    void main() {
                                    kokoko(42);
                                    }


                                    Так что обращаться можно было очень просто. Просто комплятор не проверял что ты туда передаешь. Ты мог сказать kokoko("foo") и получить туда адрес
                                    Ответить
                                    • Спасибо
                                      Ответить
                                    • Описание типов аргументов в синтаксисе K&R отдельной строкой перед блоком операторов {} случайно не из Фортрана просочилось?
                                      Ответить
                                      • не в курсе про фортран. в С это был дизайн десижн, потому что в те времена "визуальных текстовых редакторов" еще не было - как и не было нормальных дисплеев - и сырцы редактировались построчно. поэтому и каждый аргумент на своей строчке. не удивлюсь если у фортрана была та же мотивация.
                                        Ответить
                  • в строке "void img()" нет указания на количество аргументов

                    функция без аргументов это void img(void)

                    а раз не указано, то пофиг скока передавать
                    Ответить
    • Чото я думаю что C++ не лучший ЯП для создания DSLей
      Чай не груви, не руби, и не котлин
      Ответить

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