Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, 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: Ветка выделена из темы Тесты и с++
К>>А можешь выдержками поделиться? Хочется почувствовать: каково это — всё на шаблонах, тем более — всё на mpl. S>Не жалко. Вот кусочек какой-то.
Нам пока такой травы не завозили
Здравствуйте, Smal, Вы писали:
S>Не жалко. Вот кусочек какой-то.
По-моему, это не программа, а какой-то набор крокозябликов. Никогда не пойму буст — это какая-то запредельная мусорка. Хотя мой AGG местами не лучше. Но только местами.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Здравствуйте, landerhigh, Вы писали:
L>Здравствуйте, Smal, Вы писали:
К>>>А можешь выдержками поделиться? Хочется почувствовать: каково это — всё на шаблонах, тем более — всё на mpl. S>>Не жалко. Вот кусочек какой-то. L>Нам пока такой травы не завозили L>
Вы просто не умеете её курить
Здравствуйте, 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 rulesin
fold (\_1 _2 -> _1 && _CheckBase _2) True sequence
-- то же самое
-- fold (&&) True $ map _CheckBase sequence
Очевидно, что (fold (&&) True . map) — раз оно используется, как минимум, дважды, можно было вынести.
можно вопрос несколько не по теме
вот такие вот тэги К>[haskell]
что поддерживает? Янус не знает, через веб тоже просто текст. но т.к. ими пользуются, то явно что-то их поддерживает..
Здравствуйте, Кодт, Вы писали:
К>А что этот кусочек делает?
Он проверяет зависимости классов (тут не весь код).
К примеру, может быть зависимость вида, класс 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) — раз оно используется, как минимум, дважды, можно было вынести.
Согласен. С другой стороны, ИМХО, это слишком маленький кусок кода, что бы выносить его в отдельную метафункцию.
К>
К>Последний предикат проверяет, что _APred либо вообще не выполняется, либо выполняется раньше, чем _BPred. Какая-то странная логика...
Есть немного. Просто тут описана зависимость вида: если в базах с классом B есть класс A, то он должен быть раньше.
Здравствуйте, kaa.python, Вы писали:
KP>а эта программа пишется один раз и про нее благополучно забывают? или потом все ЭТО еще поддерживать надо и от багов лечить?
Один раз и на века. Гравируем на платине и ламинируем. Что бы никто грязными руками не испачкал.
ЗЫ. Не только баги правим, но и новые фичи вносим. И рефакторинг проводим. И т.д.
Здравствуйте, kaa.python, Вы писали:
KP>вот такие вот тэги К>>[haskell] KP>что поддерживает? Янус не знает, через веб тоже просто текст. но т.к. ими пользуются, то явно что-то их поддерживает..
Здравствуйте, kaa.python, Вы писали:
KP>а эта программа пишется один раз и про нее благополучно забывают? или потом все ЭТО еще поддерживать надо и от багов лечить?
Да фигня, там ничего сложного, только синтаксис громоздкий.
Эх, это вам не Таити... то есть, не Хаскель...
Здравствуйте, Smal, Вы писали:
S>Не жалко. Вот кусочек какой-то.
Ну я так понял, что ты проверяешь что последовательность содержит подпоследовательность в правильном порядке.
ИМХО на RT C++ это написать на-а-а-амного просще
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
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, то он должен быть раньше.
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Smal, Вы писали:
К>А, вот оно как. Из названия было неочевидно, что Bases — это набор метафункций (или, по-видимому, просто шаблонов баз).
Да, это шаблоны баз.
К>Там получается, что проверяем все со всеми. Для каждого шаблона базы — конъюнкцию правил, применённых к множеству воплощений. К>Громоздко, но, вероятно, именно это и нужно...
В действительности, зачастую static_assert стоит непосредственно в предикате, для более понятного сообщения об ошибке.
Здесь просто подстраховываемся на всякий пожарный.
К>>> -- fold (&&) True $ map _CheckBase sequence S>>Да. А в чем бонус? К>А фиг знает. Для языков без карринга — выгоды никакой.
В принципе, карринг тоже можно организовать .
К примеру, так C<A,__>.
К>Хотя если операции map и conjunct уже закодированы — то это будет изящнее, чем подсовывать лямбду в фолд.
Угу. Там есть что порефакторить . Сейчас проект на некоторое время заморожен, ибо развиваются другие системы.
Но будет время и возможно мы вообще откажемся от явного указания зависимостей. Есть там некоторые идеи...
Посмотрим
Здравствуйте, 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> >
{};
после чего становятся возможными всякие проверки, корректуры, подгрузка миксинов-зависимостей...
В рантайме — класс не определишь.
Хотя, если весь этот воздушный цирк служит для создания переходников к скриптовым языкам — то может быть, и можно перетащить в рантайм.
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, 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> >
К>{};
К>
К>после чего становятся возможными всякие проверки, корректуры, подгрузка миксинов-зависимостей... К>В рантайме — класс не определишь.
Вроде того.
К>Хотя, если весь этот воздушный цирк служит для создания переходников к скриптовым языкам — то может быть, и можно перетащить в рантайм.
Нет. Поддержка скрипта это отдельная фича, которая была прикручена уже после создания проекта.