Показать сообщение отдельно
Старый 10.08.2007, 10:00   #1  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Элементы функционального программирования в Axapta
Попытка эмулировать 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-функции никак не проверяется на этапе компиляции. Данного ораничения избежать нельзя никак.
Вложения
Тип файла: xpo ax_decl.xpo (11.4 Кб, 201 просмотров)
За это сообщение автора поблагодарили: Мариночка (2).