Попытка эмулировать map(), filter() и reduce() средствами Аксапты:
X++:
static void FuncTest(Args _args)
{
gm_containerCollection list = new gm_containerCollection([1, 2, 3, 4, 5, 6, 7, 8]);
;
// исходный список
info(list.toString()); // 1, 2, 3, 4, 5, 6, 7, 8
// map
list = list.map('x * x');
info(list.toString()); // 1, 4, 9, 16, 25, 36, 49, 64
list = list.map('x + x');
info(list.toString()); // 2, 8, 18, 32, 50, 72, 98, 128
// filter
list = list.filter('x > 10'); // 18, 32, 50, 72, 98, 128
info(list.toString());
// можно даже так
list = list.filter('x > 50').map('x + 1'); // 73, 99, 129
info(list.toString());
// reduce
info(list.reduce('x + y')); // 301
// одной строкой
info(new gm_containerCollection([1, 2, 3, 4, 5, 6, 7, 8]).map('x * x').map('x + x').filter('x > 10').filter('x > 50').map('x + 1').reduce('x + y'));
}
X++:
static void FuncTest2(Args _args)
{
gm_containerCollection list = new gm_containerCollection(['adfsd', 'bsdf', 'cwer']);
;
// исходный список
info(list.toString()); // adfsd, bsdf, cwer
// map
list = list.map('substr(x, 1, 1)');
info(list.toString()); // a, b, c
// filter
list = list.filter('x > "a"');
info(list.toString()); // b, c
// reduce
info(list.reduce('x + y')); // 'bc'
// одной строкой
info(new gm_containerCollection(['adfsd', 'bsdf', 'cwer']).map('substr(x, 1, 1)').filter('x > "a"').reduce('x + y'));
}
1. Идея навеяна вот этим постом (
ContainerIterator).
2. Рассматривайте данный проект, как развлечение, а не как рекомендацию для промышленного использования.
Ограничения:
1. Ошибки, возникшие при выполнении lambda-функции не контролируются разработчиком. Наверное, этого можно избежать, использую xppCompiler вместо runbuf.
2. Корректность написания lambda-функции никак не проверяется на этапе компиляции. Данного ораничения избежать нельзя никак.