Re[7]: Метапрограммисты надоели
От: Evgeny.Panasyuk Россия  
Дата: 07.10.14 00:03
Оценка: 2 (1)
Здравствуйте, WolfHound, Вы писали:

_>>Что-то там код слегка разный вроде. Ну да не принципиально, главное же идея обхода. ) Ну и да, на C++ тут самый симпатичный вариант.

WH>Вот только он не решает поставленную задачу: http://rsdn.ru/forum/philosophy/5341291.1
Автор: VladD2
Дата: 24.10.13


Эту "Помечаем его атрибутом/аннотацией [...] добавленную в класс"? Если дословно, то да — не решает.

Но конкретно в данном топике мы обсуждаем алгоритмы обхода гетерогенных последовательностей и Boost.Fusion в частности.
Если в Nemerle есть что-то готовое на эту тему, то можешь показать. Например, аналог чего-то вот такого:
auto println = [](auto... xs)
{
    initializer_list<int>({(cout << xs << " ", 0)...});
    cout << endl;
};

BOOST_FUSION_DEFINE_STRUCT
(
    (), Foo,
    (int, x)
    (double, y)
)

BOOST_FUSION_DEFINE_STRUCT
(
    (), Bar,
    (complex<double>, u)
    (string, v)
)

auto compose = [](auto f, auto g)
{
    return [=](auto... xs)
    {
        return f(g(xs...));
    };
};

auto apply = [](auto f, auto g, auto... xs)
{
    auto z = zip(xs..., transform(xs, compose(g, g))...);
    for_each(z, [=](auto x)
    {
        invoke(f, x);
    });
};

int main()
{
    Foo a = {1, .1};
    a.x *= 2;
    Bar b = {{1, 2}, "a"};
    b.v += 'b';

    auto double_it = [](auto x) { return x + x; };
    apply(println, double_it, a, b, make_vector(b.v + 'c', cos(b.u)));
}
Вывод:
2 (1,2) abc 8 (4,8) abcabcabcabc 
0.1 ab (2.03272,-3.0519) 0.4 abababab (8.13089,-12.2076)
Естественно без потери гибкости — например apply можно передать в стороннюю библиотеку, которая может вызывать его с разными наборами аргументов и т.п.

Где:
zip — zip'ует несколько гетерогенных последовательностей в одну.
transform, соответственно, трансформирует а-ля map. Причём трансформация может переводить в другой тип.
for_each — обходит гетерогенную последовательность.
invoke — вызывает "функцию" аргументами из гетерогенной последовательности, т.е. explode или распаковка.

Причём это всё работает со структурами (Foo, Bar), с кортежами/tuples (make_vector), да и вообще со всем что удовлетворяет необходимым концепциям (например "виртуальная" последовательность, не хранящая значений внутри).

WH>В том треде Evgeny.Panasyuk накидал кучу гнилых отмазок и слился.


"Слился" это означает "оппонент ничего толком не ответил, и не показал хотя бы полный рабочий код
Автор: Evgeny.Panasyuk
Дата: 25.10.13
"?
А вообще, градус озлобленности у евангелистов Nemerle поражает
Отредактировано 07.10.2014 11:04 Evgeny.Panasyuk . Предыдущая версия . Еще …
Отредактировано 07.10.2014 0:24 Evgeny.Panasyuk . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.