Сообщение Re[7]: Метапрограммисты надоели от 07.10.2014 0:03
Изменено 07.10.2014 11:04 Evgeny.Panasyuk
Здравствуйте, WolfHound, Вы писали:
_>>Что-то там код слегка разный вроде. Ну да не принципиально, главное же идея обхода. ) Ну и да, на C++ тут самый симпатичный вариант.
WH>Вот только он не решает поставленную задачу: http://rsdn.ru/forum/philosophy/5341291.1
Эту "Помечаем его атрибутом/аннотацией [...] добавленную в класс"? Если дословно, то да — не решает.
Но конкретно в данном топике мы обсуждаем алгоритмы обхода гетерогенных последовательностей и Boost.Fusion в частности.
Если в Nemerle есть что-то готовое на эту тему, то можешь показать. Например, аналог чего-то вот такого:
Естественно без потери гибкости — например apply можно передать в стороннюю библиотеку, которая может вызывать его с разными наборами аргументов и т.п.
WH>В том треде Evgeny.Panasyuk накидал кучу гнилых отмазок и слился.
"Слился" это означает "оппонент ничего толком не ответил, и не показал хотя бы полный рабочий код
А вообще, градус озлобленности у евангелистов Nemerle поражает
_>>Что-то там код слегка разный вроде. Ну да не принципиально, главное же идея обхода. ) Ну и да, на C++ тут самый симпатичный вариант.
WH>Вот только он не решает поставленную задачу: http://rsdn.ru/forum/philosophy/5341291.1
Автор: VladD2
Дата: 24.10.13
Дата: 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
"?Дата: 25.10.13
А вообще, градус озлобленности у евангелистов Nemerle поражает
Re[7]: Метапрограммисты надоели
Здравствуйте, WolfHound, Вы писали:
_>>Что-то там код слегка разный вроде. Ну да не принципиально, главное же идея обхода. ) Ну и да, на C++ тут самый симпатичный вариант.
WH>Вот только он не решает поставленную задачу: http://rsdn.ru/forum/philosophy/5341291.1
Эту "Помечаем его атрибутом/аннотацией [...] добавленную в класс"? Если дословно, то да — не решает.
Но конкретно в данном топике мы обсуждаем алгоритмы обхода гетерогенных последовательностей и Boost.Fusion в частности.
Если в Nemerle есть что-то готовое на эту тему, то можешь показать. Например, аналог чего-то вот такого:
Где:
zip — zip'ует несколько гетерогенных последовательностей в одну.
transform, соответственно, трансформирует а-ля map. Причём трансформация может переводить в другой тип.
for_each — обходит гетерогенную последовательность.
invoke — вызывает "функцию" аргументами из гетерогенной последовательности, т.е. explode или распаковка.
Причём это всё работает со структурами (Foo, Bar), с кортежами/tuples (make_vector), да и вообще со всем что удовлетворяет необходимым концепциям (например "виртуальная" последовательность, не хранящая значений внутри).
WH>В том треде Evgeny.Panasyuk накидал кучу гнилых отмазок и слился.
"Слился" это означает "оппонент ничего толком не ответил, и не показал хотя бы полный рабочий код
А вообще, градус озлобленности у евангелистов Nemerle поражает
_>>Что-то там код слегка разный вроде. Ну да не принципиально, главное же идея обхода. ) Ну и да, на C++ тут самый симпатичный вариант.
WH>Вот только он не решает поставленную задачу: http://rsdn.ru/forum/philosophy/5341291.1
Автор: VladD2
Дата: 24.10.13
Дата: 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
"?Дата: 25.10.13
А вообще, градус озлобленности у евангелистов Nemerle поражает