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). |
10.08.2007, 10:07 | #2 |
Гость
|
что-то обсудить предлагается или сразу похвалить?
|
|
10.08.2007, 10:08 | #3 |
Участник
|
|
|
10.08.2007, 10:16 | #4 |
Moderator
|
Цитата:
А что это такое?
Если хочется быстро получить представление можно почитать здесь http://ru.wikipedia.org/wiki/Функцио..._Питоне |
|
10.08.2007, 10:21 | #5 |
Гость
|
о, эмуляция питона на хапепе!
у человека много свободного времени, однозначно. |
|
10.08.2007, 10:27 | #6 |
Участник
|
Это конечно все здорово.
Но я еще когда смотрел код этих классов вчера, все думал, зачем там union, minus. Вот теперь думаю еще и о map, reduce и filter Андре, предложи область их использования. Не могу просто себе представить задачу, которая бы потребовала использования таких операций. Хотя, конечно, лучше их иметь и не использовать, чем не иметь, когда они будут нужны, наверное. |
|
10.08.2007, 10:35 | #7 |
Moderator
|
Про map(), reduce() и filter() - я писал, что это не практическое применение
Цитата:
Но я еще когда смотрел код этих классов вчера, все думал, зачем там union, minus.
- Есть функционал работающий c Excel документами - Пользователь может в документе выбрать набор ячеек и дать им наименование ("именованные ячейки") - В Аксапте, вместо того, чтобы перечислять все ячейки - он может сослаться на эту именованную область. У меня есть: - Функция, которая получает на вход имя диапазона ячеек и возвращает список ячеек (в виде gm_containerCollection. - Если именованных диапазонов несколько, то с помощью union я могу изящно получить объединение множест ячеек. - Функция minus бывает полезна, когда пользователь задает именованную область ячеек, которые должны исключаться из обработки, внутри другой именнованной области ячеек, которые должны обрабатываться. |
|
10.08.2007, 10:39 | #8 |
Участник
|
Цитата:
Сообщение от Андре
Функции высших порядков. Искать по ключевым словам - функциональное программирование, list comprehension, lambda-функции.
Если хочется быстро получить представление можно почитать здесь http://ru.wikipedia.org/wiki/Функцио..._Питоне В Аксапте актуальные не списки, а записи в базе. Поэтому в Аксапте мало функций для работы о списками, но много для работы с базой. update_recordset вполне заменяет и map, и filter. По-моему. |
|
10.08.2007, 10:40 | #9 |
Участник
|
А этот набор хранится в естественном для Аксапты виде? В таблице?
Если нет, то и инструменты требуются неестественные |
|
10.08.2007, 10:51 | #10 |
Moderator
|
Цитата:
Если я правильно понимаю, то эти функции работают со списками.
Цитата:
А этот набор хранится в естественном для Аксапты виде? В таблице?
Таким образом список ячеек получается только в момент прихода документа. В тот же момент значения этих ячеек определенным образом обрабатываются. После этого документ уходит из поля зрения Аксапты - хранить этот список далее смысла не имеет. Но.... блин, мы опять пытаемся скатиться до обсуждения одного, конкретного применения идеи. Но применений может быть и больше.... Или все считают это не важным? |
|
10.08.2007, 10:55 | #11 |
Участник
|
думаю, что функции продвинутой работы со списками имеют смысл в языках, где нет доступа к реляционным СУБД.
Списки - это всего лишь способ хранить информацию. |
|
10.08.2007, 11:01 | #12 |
Участник
|
Кстати, раз уж мы опять вернулись к теме контейнерной коллекции, приведу немного "полезной критики". Меня очень сильно всегда волнует вопрос производительности
Так вот, несколько предложений (замечаний) по методам класса: X++: void add(anytype _value) { con += _value;//conpoke(con, conlen(con) + 1, _value); } X++: boolean in(anytype _value) { int i; ; //for (i=1; i<=conlen(con); i++) //{ // if (conpeek(con, i) == _value) // return true; //} if (conFind(con, _value)) return true; return false; } |
|
10.08.2007, 11:01 | #13 |
Moderator
|
Цитата:
думаю, что функции продвинутой работы со списками имеют смысл в языках, где нет доступа к реляционным СУБД
|
|
10.08.2007, 11:07 | #14 |
Moderator
|
Цитата:
Кстати, раз уж мы опять вернулись к теме контейнерной коллекции, приведу немного "полезной критики".
|
|
10.08.2007, 11:11 | #15 |
Участник
|
Цитата:
Сообщение от Андре
Тебе виднее. К слову, метод union() который мы сейчас обсуждаем присутствует в Аксаптовском классе Set. И выполняет он то, же, что и мой метод, только над set-ом (который, по сути, тоже список), а не над контейнером. Но ведь в Аксапте есть СУБД и необходимости в функциях работы со списками нет, вот так парадокс....
Не встречал использование Set, но Аксаптовские Map и List активно используются при закрытии склада. По сути дела, вместо того, чтобы сделать нормальную работу с СУБД разработчик копирует записи в своп клиента и делает вид, что это оптимизация - ведь блокировок нет! А потом доблестно бьется за целостность информации и умирающим от натуги клиентом... Убил бы... Тоже наверное сделал человек, который пришел из спискоориентированных языков... Причем ладно бы использовал уже существующий встроенный контейнер. Дык нет, изобрели свои классы... (Что-то я злой в последнее время... Завершаю оффтопик, извините) |
|
10.08.2007, 11:14 | #16 |
Участник
|
Последний раз редактировалось kashperuk; 12.08.2007 в 16:54. |
|
|
За это сообщение автора поблагодарили: vladz (1). |
10.08.2007, 11:15 | #17 |
Участник
|
Цитата:
Кажется Пролог когда-то умел работать с реляционными БД. |
|
10.08.2007, 11:15 | #18 |
Moderator
|
Цитата:
Что-то я злой в последнее время...
|
|
10.08.2007, 11:17 | #19 |
Moderator
|
Цитата:
Хм. Взялся проверить, чтобы не быть голословным.
Получается как раз наоборот. Цитата:
Кажется Пролог когда-то умел работать с реляционными БД.
|
|
10.08.2007, 11:17 | #20 |
Участник
|
Цитата:
Пролог - сугубо спискоориентированный язык. |
|
|
|