10.08.2007, 10:00 | #1 |
Moderator
|
Элементы функционального программирования в 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')); } 2. Рассматривайте данный проект, как развлечение, а не как рекомендацию для промышленного использования. Ограничения: 1. Ошибки, возникшие при выполнении lambda-функции не контролируются разработчиком. Наверное, этого можно избежать, использую xppCompiler вместо runbuf. 2. Корректность написания lambda-функции никак не проверяется на этапе компиляции. Данного ораничения избежать нельзя никак. |
|
|
За это сообщение автора поблагодарили: Мариночка (2). |
|
|