Реальный пример с mpl
От: Smal Россия  
Дата: 30.08.07 17:24
Оценка: :)
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Smal, Вы писали:


S>>+ к этому у нас есть проект на boost::mpl. Там все на шаблонах .


К>А можешь выдержками поделиться? Хочется почувствовать: каково это — всё на шаблонах, тем более — всё на mpl.


Не жалко. Вот кусочек какой-то.
   template< class Bases, class Derived >
   struct CheckDependencies
   {
   private:
      typedef  typename instantiate_sequence< Bases, Derived > :: type sequence;

      typedef mpl::placeholders::_1 __1;
      typedef mpl::placeholders::_2 __2;
      
      template< class B >
         struct CheckBase
      {
      private:
         template< class R >
            struct CheckRule
               : R::apply< B, sequence, Derived >::type
         {};

         typedef typename Rules< B > rules;

      public:
         typedef typename mpl::fold<rules, mpl::true_, mpl::and_< __1, CheckRule<__2> > > :: type type;
      };

   public:
      typedef typename mpl::fold<sequence, mpl::true_, mpl::and_< __1, CheckBase<__2> > > :: type type;
   };

   namespace details
   {
      template< class APred, class BPred, class Sequence >
         struct Precedes
      {
            static const int size = mpl::size< Sequence >::type::value;

            typedef typename mpl::find_if < Sequence, APred >  :: type Ait;
            typedef typename mpl::find_if < Sequence, BPred >  :: type Bit;

            static const int Aidx = mpl::distance< typename mpl::begin<Sequence>::type, Ait >::type::value;
            static const int Bidx = mpl::distance< typename mpl::begin<Sequence>::type, Bit >::type::value;

            static const bool value = (Aidx == size) || (Aidx < Bidx);

         public:
            typedef mpl::bool_< value > type;
      };
   }



31.08.07 12:51: Ветка выделена из темы Тесты и с++
Автор: carpenter
Дата: 29.08.07
— Кодт
С уважением, Александр
Re: Реальный пример с mpl
От: landerhigh Пират  
Дата: 31.08.07 03:50
Оценка:
Здравствуйте, Smal, Вы писали:


К>>А можешь выдержками поделиться? Хочется почувствовать: каково это — всё на шаблонах, тем более — всё на mpl.

S>Не жалко. Вот кусочек какой-то.
Нам пока такой травы не завозили
www.blinnov.com
Re: Реальный пример с mpl
От: McSeem2 США http://www.antigrain.com
Дата: 31.08.07 05:39
Оценка: +1 :)
Здравствуйте, Smal, Вы писали:

S>Не жалко. Вот кусочек какой-то.


По-моему, это не программа, а какой-то набор крокозябликов. Никогда не пойму буст — это какая-то запредельная мусорка. Хотя мой AGG местами не лучше. Но только местами.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[2]: Реальный пример с mpl
От: Smal Россия  
Дата: 31.08.07 06:15
Оценка:
Здравствуйте, landerhigh, Вы писали:

L>Здравствуйте, Smal, Вы писали:



К>>>А можешь выдержками поделиться? Хочется почувствовать: каково это — всё на шаблонах, тем более — всё на mpl.

S>>Не жалко. Вот кусочек какой-то.
L>Нам пока такой травы не завозили
L>
Вы просто не умеете её курить
С уважением, Александр
Re: Реальный пример с mpl
От: Кодт Россия  
Дата: 31.08.07 07:55
Оценка:
Здравствуйте, Smal, Вы писали:

К>>А можешь выдержками поделиться? Хочется почувствовать: каково это — всё на шаблонах, тем более — всё на mpl.


S>Не жалко. Вот кусочек какой-то.


А что этот кусочек делает?

Перепёр вашу полечку на Хаскель. Сижу, курю...
_CheckDependencies _Bases _Derived =
    let
        sequence = instantiate_sequence _Bases _Derived
        -- это что, sequence = zip _Bases _Derived ?
        _CheckBase b =
            let
                _CheckRule r = r b sequence _Derived -- если zip, то зачем сюда снова передавать _Derived ?
                rules = _Rules b
            in
                fold (\_1 _2 -> _1 && _CheckRule _2) True rules
                -- можно было fold (&&) True $ map _CheckRule rules
    in
        fold (\_1 _2 -> _1 && _CheckBase _2) True sequence
        -- то же самое
        -- fold (&&) True $ map _CheckBase sequence

Очевидно, что (fold (&&) True . map) — раз оно используется, как минимум, дважды, можно было вынести.
conjunct_map = fold (&&) True . map

template<template<class>class Pred, class Sequence>
struct conjunct_map : mpl::fold<Sequence, mpl::true_, mpl::and_<__1, Pred<__2> > > {};



_Precedes _APred _BPred _Sequence =
    let
        size = length _Sequence
        _Aidx = length $ takeWhile (not _APred) _Sequence
        _Bidx = length $ takeWhile (not _BPred) _Sequence
        value = _Aidx == size || _Aidx < _Bidx
    in
        value

Последний предикат проверяет, что _APred либо вообще не выполняется, либо выполняется раньше, чем _BPred. Какая-то странная логика...
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: Реальный пример с mpl
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 31.08.07 08:11
Оценка:
Здравствуйте, Кодт, Вы писали:

можно вопрос несколько не по теме
вот такие вот тэги
К>[haskell]
что поддерживает? Янус не знает, через веб тоже просто текст. но т.к. ими пользуются, то явно что-то их поддерживает..
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Реальный пример с mpl
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 31.08.07 08:16
Оценка:
а эта программа пишется один раз и про нее благополучно забывают? или потом все ЭТО еще поддерживать надо и от багов лечить?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Реальный пример с mpl
От: Smal Россия  
Дата: 31.08.07 08:25
Оценка:
Здравствуйте, Кодт, Вы писали:

К>А что этот кусочек делает?

Он проверяет зависимости классов (тут не весь код).
К примеру, может быть зависимость вида, класс A должен быть раньше класса B.

К>Перепёр вашу полечку на Хаскель. Сижу, курю...

К>_CheckDependencies _Bases _Derived =
К>    let
К>        sequence = instantiate_sequence _Bases _Derived
К>        -- это что, sequence = zip _Bases _Derived ?

К>        _CheckBase b =
К>            let
К>                _CheckRule r = r b sequence _Derived -- если zip, то зачем сюда снова передавать _Derived ?
К>                rules = _Rules b
К>            in
К>                fold (\_1 _2 -> _1 && _CheckRule _2) True rules
К>                -- можно было fold (&&) True $ map _CheckRule rules
К>    in
К>        fold (\_1 _2 -> _1 && _CheckBase _2) True sequence
К>        -- то же самое
К>        -- fold (&&) True $ map _CheckBase sequence
К>

_Derived :: Class

_Bases :: [Class -> Class]

instantiate_sequence :: [Class -> Class] -> Class -> [Class]
instantiate_sequence b d = map (\x -> x d) b


В _CheckRule _Derived передается т.к. правило может зависеть от derived.
Идея в том, что для каждой базы мы проверяем все правила, которые с ней ассоциированы.
Если хоть какое-то правило вернет false, то в результате мы получим false.

К> -- fold (&&) True $ map _CheckBase sequence

Да. А в чем бонус?

К>Очевидно, что (fold (&&) True . map) — раз оно используется, как минимум, дважды, можно было вынести.

Согласен. С другой стороны, ИМХО, это слишком маленький кусок кода, что бы выносить его в отдельную метафункцию.

К>
К>conjunct_map = fold (&&) True . map
К>

К>
К>template<template<class>class Pred, class Sequence>
К>struct conjunct_map : mpl::fold<Sequence, mpl::true_, mpl::and_<__1, Pred<__2> > > {};
К>

Спасибо. Может вынесу.

К>
К>_Precedes _APred _BPred _Sequence =
К>    let
К>        size = length _Sequence
К>        _Aidx = length $ takeWhile (not _APred) _Sequence
К>        _Bidx = length $ takeWhile (not _BPred) _Sequence
К>        value = _Aidx == size || _Aidx < _Bidx
К>    in
К>        value
К>

К>Последний предикат проверяет, что _APred либо вообще не выполняется, либо выполняется раньше, чем _BPred. Какая-то странная логика...
Есть немного. Просто тут описана зависимость вида: если в базах с классом B есть класс A, то он должен быть раньше.
С уважением, Александр
Re[2]: Реальный пример с mpl
От: Smal Россия  
Дата: 31.08.07 08:28
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>а эта программа пишется один раз и про нее благополучно забывают? или потом все ЭТО еще поддерживать надо и от багов лечить?

Один раз и на века. Гравируем на платине и ламинируем. Что бы никто грязными руками не испачкал.

ЗЫ. Не только баги правим, но и новые фичи вносим. И рефакторинг проводим. И т.д.
С уважением, Александр
Re[3]: Реальный пример с mpl
От: Кодт Россия  
Дата: 31.08.07 08:28
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>вот такие вот тэги

К>>[haskell]
KP>что поддерживает? Янус не знает, через веб тоже просто текст. но т.к. ими пользуются, то явно что-то их поддерживает..

Янус-2.0 поддерживает. Веб тоже поддерживает.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: Реальный пример с mpl
От: Кодт Россия  
Дата: 31.08.07 08:28
Оценка: 1 (1)
Здравствуйте, kaa.python, Вы писали:

KP>а эта программа пишется один раз и про нее благополучно забывают? или потом все ЭТО еще поддерживать надо и от багов лечить?


Да фигня, там ничего сложного, только синтаксис громоздкий.
Эх, это вам не Таити... то есть, не Хаскель...
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re: Реальный пример с mpl
От: Erop Россия  
Дата: 31.08.07 08:54
Оценка:
Здравствуйте, Smal, Вы писали:

S>Не жалко. Вот кусочек какой-то.

Ну я так понял, что ты проверяешь что последовательность содержит подпоследовательность в правильном порядке.
ИМХО на RT C++ это написать на-а-а-амного просще
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: Тесты и с++
От: Кодт Россия  
Дата: 31.08.07 09:05
Оценка:
Здравствуйте, Smal, Вы писали:

S>
S>_Derived :: Class

S>_Bases :: [Class -> Class]

S>instantiate_sequence :: [Class -> Class] -> Class -> [Class]
S>instantiate_sequence b d = map (\x -> x d) b
S>

А, вот оно как. Из названия было неочевидно, что Bases — это набор метафункций (или, по-видимому, просто шаблонов баз).

S>В _CheckRule _Derived передается т.к. правило может зависеть от derived.

S>Идея в том, что для каждой базы мы проверяем все правила, которые с ней ассоциированы.
S>Если хоть какое-то правило вернет false, то в результате мы получим false.

Там получается, что проверяем все со всеми. Для каждого шаблона базы — конъюнкцию правил, применённых к множеству воплощений.
Громоздко, но, вероятно, именно это и нужно...

К>> -- fold (&&) True $ map _CheckBase sequence

S>Да. А в чем бонус?
А фиг знает. Для языков без карринга — выгоды никакой. Хотя если операции map и conjunct уже закодированы — то это будет изящнее, чем подсовывать лямбду в фолд.
Путь APL — вектор булей.

К>>Последний предикат проверяет, что _APred либо вообще не выполняется, либо выполняется раньше, чем _BPred. Какая-то странная логика...

S>Есть немного. Просто тут описана зависимость вида: если в базах с классом B есть класс A, то он должен быть раньше.

Опять же, можно было сделать примитивные функции
#define TN(...) typename __VA_ARGS__::type
#define TV(...) __VA_ARGS__::type::value

template<class S, class Pred>
struct cspan : mpl::distance<TN(mpl::begin<S>), TN(mpl::find_if<S,Pred>) {};
// по аналогии с strspan (including), strcspan (excluding)

template<class S, class PA, class PB>
struct precede_or_pass
{
private:
    typedef mpl::size<S> size;
    typedef cspan<S,PA> cspanA;
    typedef cspan<S,PB> cspanB;
public:
    typedef mpl::bool_< TV(cspanA)==TV(size) || TV(cspanA)<TV(spanB) > type;
};
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[7]: Тесты и с++
От: Smal Россия  
Дата: 31.08.07 09:27
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Smal, Вы писали:


К>А, вот оно как. Из названия было неочевидно, что Bases — это набор метафункций (или, по-видимому, просто шаблонов баз).

Да, это шаблоны баз.

К>Там получается, что проверяем все со всеми. Для каждого шаблона базы — конъюнкцию правил, применённых к множеству воплощений.

К>Громоздко, но, вероятно, именно это и нужно...
В действительности, зачастую static_assert стоит непосредственно в предикате, для более понятного сообщения об ошибке.
Здесь просто подстраховываемся на всякий пожарный.

К>>> -- fold (&&) True $ map _CheckBase sequence

S>>Да. А в чем бонус?
К>А фиг знает. Для языков без карринга — выгоды никакой.
В принципе, карринг тоже можно организовать .
К примеру, так C<A,__>.

К>Хотя если операции map и conjunct уже закодированы — то это будет изящнее, чем подсовывать лямбду в фолд.

Угу. Там есть что порефакторить . Сейчас проект на некоторое время заморожен, ибо развиваются другие системы.
Но будет время и возможно мы вообще откажемся от явного указания зависимостей. Есть там некоторые идеи...
Посмотрим
С уважением, Александр
Re[3]: Реальный пример с mpl
От: minorlogic Украина  
Дата: 31.08.07 09:40
Оценка: 1 (1)
Здравствуйте, Кодт, Вы писали:

К>Да фигня, там ничего сложного, только синтаксис громоздкий.

Да вы льстите уважаемый , "громоздкий", это УЖОС !!!!
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[2]: Реальный пример с mpl
От: Кодт Россия  
Дата: 31.08.07 10:13
Оценка:
Здравствуйте, Erop, Вы писали:

E>Ну я так понял, что ты проверяешь что последовательность содержит подпоследовательность в правильном порядке.

E>ИМХО на RT C++ это написать на-а-а-амного просще

Это, похоже, код, который проверяет корректность определения класса
Т.е.
class Foo : public Bar1<Foo>, public Bar2<Foo>, ...., public BarN<Foo> // дофига баз и миксинов
{};
// заменяем на
class Foo : derive_from< mpl::vector<Bar1, Bar2, ...., BarN> >
{};

после чего становятся возможными всякие проверки, корректуры, подгрузка миксинов-зависимостей...
В рантайме — класс не определишь.

Хотя, если весь этот воздушный цирк служит для создания переходников к скриптовым языкам — то может быть, и можно перетащить в рантайм.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[3]: Реальный пример с mpl
От: Smal Россия  
Дата: 31.08.07 11:37
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Erop, Вы писали:


E>>Ну я так понял, что ты проверяешь что последовательность содержит подпоследовательность в правильном порядке.

E>>ИМХО на RT C++ это написать на-а-а-амного просще

К>Это, похоже, код, который проверяет корректность определения класса

К>Т.е.
К>
К>class Foo : public Bar1<Foo>, public Bar2<Foo>, ...., public BarN<Foo> // дофига баз и миксинов
К>{};
К>// заменяем на
К>class Foo : derive_from< mpl::vector<Bar1, Bar2, ...., BarN> >
К>{};
К>

К>после чего становятся возможными всякие проверки, корректуры, подгрузка миксинов-зависимостей...
К>В рантайме — класс не определишь.
Вроде того.

К>Хотя, если весь этот воздушный цирк служит для создания переходников к скриптовым языкам — то может быть, и можно перетащить в рантайм.

Нет. Поддержка скрипта это отдельная фича, которая была прикручена уже после создания проекта.
С уважением, Александр
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.