Здравствуйте, niXman, Вы писали:
X>Здравствуйте, kurchatov, Вы писали:
K>>Какие средства предоставляет буст для отладки метапрограмм? X>как же ты любишь винить в своей некомпетентности что-то кроме себя =)
? Я вообще-то серьезно спросил, про средства отладки.
Здравствуйте, WolfHound, Вы писали:
_>>Вариант Евгения я уже указал как подправить в точности под ваши требования, хотя на мой взгляд это всего лишь придирка (вообще не принципиально функция-член или отдельная шаблонная функция). Про вариант с record тоже всё работает в соответствие с примерами из описания. То, что при этом внутри реализуется чуть другая логика — это опять же придирка. ) WH>Конструкторы предка не создаёт. WH>С приватными членами класса не работает. WH>Фильтрации нет. WH>...
Конструкторы не создаёт, а в описание к Record такого и нет. ) С приватными членами класса никаких проблем нет. С фильтрацией тоже — я чётко описал как её реализовать. )
А к варианту Евгения уже вопросов нет вроде? )
_>>Ну так реализуется то через макросы, а не пересборкой компилятора. ) WH>В случае немерле это одно и то же. А в случае rust существенно разные механизмы. WH>Кстати я тут ещё раз на него глянул. До немерлового варианта ему как до пешком луны.
А что там не так? )
Если что, я сам не смотрел и вообще про Rust почти не в курсе. Хотя подумываю попробовать поиграться и с ним... Так сказать сравнить с D, который я уже более менее ощущаю как инструмент.
ХГД>>Как раз это и называется "высокий порог вхождения" X>думается мне, тут последовательность другая. X>тот кто только "входит в с++" — вряд ли станет юзать спирит. а тот кто сознательно и объективно выбирает спирит — уже имеет весь необходимый "багаж знаний", чтоб понять о чем простыня размером в *надцать страниц. но это ИМХО, конечно.
Ну это несколько противоречит сказанному в соседних сообщениях — "да какой порог вхождения, достаточно EBNF знать, остальное интуитивно" и "лучше все равно ничего нет".
Если же говорить про конкретную ошибку, то тут не в размере простыни дело. Это, увы, своего рода "задачка на сообразительность". О причине ошибки даже проще догадаться было бы не по той простыне, а по следующему за тем, что я привел, однострочному сообщению об ошибке —
boost/fusion/container/vector/convert.hpp(25): error C2027: use of undefined type 'boost::fusion::detail::as_vector<12>'
Вот только для этого, IMHO, надо хоть как-то представлять общие принципы написания подобных fusion либ. Что автоматически исключает не только новичков, но и просто широкие массы не склонных к метапрограммированию и ковырятельству в потрохах библиотек разработчиков. И я, собственно, не вижу в спирите ничего такого, ради чего стоило бы со всем этим возиться. Разве что задача стать мастером ци-гун является самоцелью.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, kurchatov, Вы писали:
K>Отладка компиляции — это прекрасно. Какие средства предоставляет буст для отладки метапрограмм?
(я тут надеюсь, ты это серьезно спрашиваешь, а не просто троллишь)
boost::mpl::print, BOOST_MPL_ASSERT_MSG вкупе с правильно организованной диагностикой.
(пример использования можно увидеть в конце http://rsdn.ru/forum/cpp/3722136.1
)
Рулез последнего в том, что его очень хорошо видно благодаря куче звездочек, и все полотенце можно смело не читать.
Почему-то программисты, которые продумывают обработку ошибок в своих программах, совершенно об этом забывают при написании метапрограмм.
А потом получают коредамп огромный вывод компилятора и говорят, что очень трудно отлаживать.
Как будто легко разбираться в дампе обычной рухнувшей программы, если в ней не было никакой обработки ошибок.
Писать метапрограммы надо, вынося обработку ошибок в отдельное место, чтоб компилятор не пытался компилировать заведомо неправильный код и не выносил пользователю мозг тоннами сообщений об ошибках в нем: http://rsdn.ru/forum/cpp/4530248.1
Здравствуйте, jazzer, Вы писали:
ХГД>>Это при применении спирита их искать замучаешься А уж если надо вычислять позицию, на которой случился синтакс еррор — вообще вешайся. А с низкоуровневым кодом пофиг, все прекрасно отлаживается, если чего-то не хватает — дописать можно без многочасовых копаний в доках или чужих исходниках. J>На этот счет у меня есть специальный одноклеточный "парсер" throw_p, который прекращает парсинг и бросает исключение со всем необходимым (строка, колонка, объяснение). J>Типа:
Здравствуйте, alex_public, Вы писали:
_>А к варианту Евгения уже вопросов нет вроде? )
Надоело повторять. Всё равно очевидное не признаешь.
_>А что там не так? )
Rust только проверяет синтаксис. А немерле ещё много чего делает.
Прочитай описание. Там полторы страницы на двоих.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
_>>А к варианту Евгения уже вопросов нет вроде? ) WH>Надоело повторять. Всё равно очевидное не признаешь.
Имелось в виду с моей поправкой (что реализуем функцию-член через наследование) — тогда даже с вашей дурацкой придиркой всё в точности выходит.
WH>Rust только проверяет синтаксис. А немерле ещё много чего делает.
А что ещё может быть нужно? ) Ну т.е. конечно ещё типобезопасность передаваемых в запрос параметров, но это уже надо схему базы данных и т.п. )
Здравствуйте, alex_public, Вы писали:
_>Имелось в виду с моей поправкой (что реализуем функцию-член через наследование) — тогда даже с вашей дурацкой придиркой всё в точности выходит.
Наследование не работает. Я тебе это показал.
_>А что ещё может быть нужно? ) Ну т.е. конечно ещё типобезопасность передаваемых в запрос параметров, но это уже надо схему базы данных и т.п. ) https://github.com/rsdn/nemerle/wiki/SQL-macros
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, niXman, Вы писали:
X>абсолютно каждая компания в_которой/с_которой мне приходилось работать — использовали boost. так что я хз, о чем ты...
У меня ровно обратное — ни в одной компании boost не использовали.
Здравствуйте, Dair, Вы писали:
X>>абсолютно каждая компания в_которой/с_которой мне приходилось работать — использовали boost. так что я хз, о чем ты... D>У меня ровно обратное — ни в одной компании boost не использовали.
Более того — есть конторы где явный запрет использовать в продакшне либы навроде буста.
J>>И синтаксические ошибки сразу перестают быть проблемой.
EP>Причём если не хочется, можно даже свой throw_p не писать (хоть он и удобен) — есть готовые qi::eps, operator> и т.п.
Если честно, я не знаю, как из eps достать позицию. Поэтому и написал свой парсер.
Т.е. примерно понятно, как это сделать в классическом спирите, там в действие приходит пара итераторов, а как с qi — не знаю, там же атрибут приходит.
Я просто основную массу своих парсеров написал на классическом, второй вышел слишком поздно, у меня на нем пара парсеров всего.
Здравствуйте, jazzer, Вы писали:
J>Если честно, я не знаю, как из eps достать позицию. Поэтому и написал свой парсер. J>Т.е. примерно понятно, как это сделать в классическом спирите, там в действие приходит пара итераторов, а как с qi — не знаю, там же атрибут приходит.
И не нужно доставать (насколько я представляю, они и не передаются в семантическое действие) — expectation parser сам кинет исключение expectation_failure, в котором есть пара итераторов и what_ (которое зависит от .name правил). Можно исключение самому ловить, а можно просить Spirit через on_error. Причём там даже можно восстановится после ошибки и продолжить разбор.
Полный пример тут — Mini XML Error Handling.
J>Я просто основную массу своих парсеров написал на классическом, второй вышел слишком поздно, у меня на нем пара парсеров всего.
Кстати, а мне задачи парсинга вообще редко попадаются, но Spirit использую без проблем.
Здравствуйте, WolfHound, Вы писали:
WH>Наследование не работает. Я тебе это показал.
Ты ничего не показал. Ты написал некую ерунду, я тебе на это указал и дальше ты промолчал. Давай ещё раз по пунктам:
1. Вообще то изначально говорилось просто про функцию-член, а не члена некого абстрактного интерфейса, так что классический вариант примеси (mixin) на C++ отлично работал.
2. Но если захотим и абстрактный интерфейс использовать, то тоже абсолютно никаких проблем. Я не понял откуда ты взял тот бредовый код с наследованием структурки (а не примеси) от интерфейса. Вот нормальный пример:
Значит имеем некий интерфейс:
struct IHash{ virtual int GetHash()=0; };
и некий класс, которому мы хотим добавить автоматическую реализацию этого интерфейса:
struct Person{
string name;
int age;
bool sex;
};
Ну так это будет банально выглядеть так:
struct Person: public HashImpl<Person>{
string name;
int age;
bool sex;
};
void PrintHash(IHash* h) {cout<<h->GetHash()<<endl;}
Person p;
PrintHash(&p);
где реализация является тривиальным
template<typename T> struct HashImpl: public IHash{
int GetHash() override {/* здесь код Евгения */}
};
3. Самое забавное, что это далеко не единственный способ. Можно ещё и по другому добавлять. Например самый банальный способ будет таким:
struct Person{
string name;
int age;
bool sex;
declare_hash;
};
с реализацией вида
#define declare_hash int GetHash() {/* здесь код Евгения */}
Опять же ровно одна дополнительная строка в классе (как и в D или Nemerle). Так что не вижу вообще никаких проблем в данной области. Собственно я вообще считаю глупым придирку по поводу функции вместо функции-члена, т.к. в целом речь была о другом. Но даже эта придирика у вас не вышла.
А особенно это всё забавно на фоне того факта, что на C++ действительно недоступно множество возможностей МП, которые есть в D/Rust/Nemerle. Но вы в них почему-то не попадаете никак — похоже привыкли демонстрировать превосходство Nemerle над совсем унылым C#, а не над C++.)))
_>>А что ещё может быть нужно? ) Ну т.е. конечно ещё типобезопасность передаваемых в запрос параметров, но это уже надо схему базы данных и т.п. ) WH>https://github.com/rsdn/nemerle/wiki/SQL-macros
О, а вот передача параметров в запрос по имени локальной переменной — это действительно выглядит классно. В C++ библиотечке для работы с БД аналогичное делается только по порядку, что значительно менее наглядно. Про проверку синтаксиса я вообще не говорю. )))
Да, а вот на D думаю без проблем делается нечто похожее, хотя готовых реализаций не видел.
Здравствуйте, Ikemefula, Вы писали:
I>Более того — есть конторы где явный запрет использовать в продакшне либы навроде буста.
назовите, пожалуйста, хоть одну такую контору. ибо я предполагаю, что это либо никчемный стартап, либо что-то низко-совковое. потому что ни твитер, ни фейсбук, ни гугл, ни адоб, ни оракл — быть не может в вашем списке.
спасибо, очень жду ваш список конторок.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
K>>Какие средства предоставляет буст для отладки метапрограмм?
Браво, хороший вопрос! )
X>как же ты любишь винить в своей некомпетентности что-то кроме себя =)
<психоанализ мод он>Парень спросил про буст, а ты подумал что раз очевидно что это должен делать язык и рантайм,
но рантайм не может по определению, то значит в языке С++ такое невозможно —
следовательно упоминание конкретно про буст была нападка.
А ведь это серьезный вопрос.
<психоанализ мод офф>
Действительно: С++ такого не может. Жаль, и мне нравится С++ тоже, но это так.
---
Я всегда говорю: хотите узнать насколько готова среда для реальной настоящей работы, а не исследовательской
или поиграться — посмотрите для этого какие есть средства для отладки в этой среде.
Потому что в реальной жизни всегда есть реальные проблемы, т.е. трудные. Если есть отладчик,
значит тут кто-то был до нас и сделал как надо для работы для решения проблем. а не выпендрежа.
Особенно хорошо если это кто-то был из разработчиков ядра системы, и встроил концепции глубоко и правильно,
а не для собственного прикола, как в данном случае со Страуструпом случилось.
Вот например в Common Lisp-e макрос отладить можно с помощью функций macroexpand и macroexpand-1.
Видно, что лисп сделан как "программируемый язык программирования" (это его мотто).
Те, кто хотят работать с С++ом на этом уровне берут OpenC++ и т.п. вещи, допиливают для себя, делают из
него инструменты, пытаются коммерциализировать (сипровер весь хабр заспамил), и все равно не дотягивает,
и в итоге то что в "лиспах" есть из коробки и в его ядре, в других языках чаще всего недоступно вообще никак.
Здравствуйте, Cyberax, Вы писали:
C>Здравствуйте, Mna, Вы писали:
C>>>Ну так в LISP уродливо всё остальное. Mna>>Есть претензии к Common Lisp кроме скобок? C>Отсутствие типов, отсутствие нормального синтаксиса и т.п.
Скобки для лиспа и синтаксис это одно и то же.
Это преодолевается таким образом:
на самом деле я думаю Питон взял отступы из Лиспа, ведь там дописывают закрывающие скобки
автоматом в среде, а открывают перед каждым нужным новым keyword-ом, и учитывая отступы по вложенности,
то есть получается как в Питоне, но без обязаловки с отступами.
ну то есть это в принципе нормально. среда рулит.
Остаются динамические типы против статических.
Тут сказать нечего: программисты бывают двух типов.
1 выбирающие мощь и свободу, или
2 выбирающие ограничения и призрачную надежду.
Ограничения в виде барьеров лишних объявлений, и инквизиции статических проверок компилятора,
с надеждой что такой язык/компилятор себя окупит в среде масс корпоративных программистов, которые согласно обычаю
не проверяют ни типов и не пишут никогда тестов, согласно тому же обычаю.
Их девиз "компилируется значит работает"
Здравствуйте, Mna, Вы писали:
Mna>Остаются динамические типы против статических. Mna>Тут сказать нечего: программисты бывают двух типов. Mna>1 выбирающие мощь и свободу, или Mna>2 выбирающие ограничения и призрачную надежду. Mna>Ограничения в виде барьеров лишних объявлений, и инквизиции статических проверок компилятора, Mna> с надеждой что такой язык/компилятор себя окупит в среде масс корпоративных программистов, которые согласно обычаю Mna> не проверяют ни типов и не пишут никогда тестов, согласно тому же обычаю. Mna> Их девиз "компилируется значит работает"
А можно озвучить мощный и свободный язык программирования, который позволит мне осуществлять сложную фильтрацию в реальном времени FHD/4K видео? )
Здравствуйте, alex_public, Вы писали:
_>Здравствуйте, Mna, Вы писали:
Mna>>Остаются динамические типы против статических. Mna>>Тут сказать нечего: программисты бывают двух типов. Mna>>1 выбирающие мощь и свободу, или Mna>>2 выбирающие ограничения и призрачную надежду. Mna>>Ограничения в виде барьеров лишних объявлений, и инквизиции статических проверок компилятора, Mna>> с надеждой что такой язык/компилятор себя окупит в среде масс корпоративных программистов, которые согласно обычаю Mna>> не проверяют ни типов и не пишут никогда тестов, согласно тому же обычаю. Mna>> Их девиз "компилируется значит работает"
_>А можно озвучить мощный и свободный язык программирования, который позволит мне осуществлять сложную фильтрацию в реальном времени FHD/4K видео? )
Если ты про производительность,
то когда нужна производительность выбираешь низкоуровневый язык поближе к железу и не рыпаешься просто нет других вариантов, -- тут понятно, я ничего не смогу предложить : С++/С -- и может даже писать ассемблерные вставки вручную, если С компилятор новые инструкции пока не поддерживает.
Но если С компилятор не поддерживает, то тот же асм можно сгенерировать и функциональными языками программирования, почему нет. может даже и попроще будет.
А ежели ты про то, что статические ограничения особенно увеличивают производительность, я считаю что пример Haskell-а, самого органичивающего показывает, что ограничения не спасают, и все равно получается медленно.
Или например С++, его "метапрограммы" жутко медленно компилируются.
Нет я бы тоже хотел, чтоб все хорошее в языке было (не важно название) и не было ничего плохого , но приходится выбирать.