Информация об изменениях

Сообщение Re[7]: Метапрограммисты надоели от 07.10.2014 0:03

Изменено 07.10.2014 0:24 Evgeny.Panasyuk

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

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

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


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

Но конкретно в данном топике мы обсуждаем алгоритмы обхода гетерогенных последовательностей и Boost.Fusion в частности.
Если в Nemerle есть что-то готовое на эту тему, то можешь показать. Например, аналог чего-то вот такого:
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 можно передать в стороннюю библиотеку, которая может вызывать его с разными наборами аргументов и т.п.

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


"Слился" это означает "оппонент ничего толком не ответил, и не показал хотя бы полный рабочий код
Автор: Evgeny.Panasyuk
Дата: 25.10.13
"?
А вообще, градус озлобленности у евангелистов Nemerle поражает
Здравствуйте, 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 можно передать в стороннюю библиотеку, которая может вызывать его с разными наборами аргументов и т.п.

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


"Слился" это означает "оппонент ничего толком не ответил, и не показал хотя бы полный рабочий код
Автор: Evgeny.Panasyuk
Дата: 25.10.13
"?
А вообще, градус озлобленности у евангелистов Nemerle поражает