AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 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 Кб, 198 просмотров)
За это сообщение автора поблагодарили: Мариночка (2).
Старый 10.08.2007, 10:07   #2  
otkudao
Гость
 
n/a
что-то обсудить предлагается или сразу похвалить?
Старый 10.08.2007, 10:08   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Андре Посмотреть сообщение
Попытка эмулировать map(), filter() и reduce()
А что это такое?
__________________
полезное на axForum, github, vk, coub.
Старый 10.08.2007, 10:16   #4  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
А что это такое?
Функции высших порядков. Искать по ключевым словам - функциональное программирование, list comprehension, lambda-функции.

Если хочется быстро получить представление можно почитать здесь
http://ru.wikipedia.org/wiki/Функцио..._Питоне
Старый 10.08.2007, 10:21   #5  
otkudao
Гость
 
n/a
о, эмуляция питона на хапепе!

у человека много свободного времени, однозначно.
Старый 10.08.2007, 10:27   #6  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Это конечно все здорово.
Но я еще когда смотрел код этих классов вчера, все думал, зачем там union, minus.
Вот теперь думаю еще и о map, reduce и filter

Андре, предложи область их использования.
Не могу просто себе представить задачу, которая бы потребовала использования таких операций.
Хотя, конечно, лучше их иметь и не использовать, чем не иметь, когда они будут нужны, наверное.
Старый 10.08.2007, 10:35   #7  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Про map(), reduce() и filter() - я писал, что это не практическое применение

Цитата:
Но я еще когда смотрел код этих классов вчера, все думал, зачем там union, minus.
А вот union и minus у меня в проекте реально используются:
- Есть функционал работающий c Excel документами
- Пользователь может в документе выбрать набор ячеек и дать им наименование ("именованные ячейки")
- В Аксапте, вместо того, чтобы перечислять все ячейки - он может сослаться на эту именованную область.

У меня есть:
- Функция, которая получает на вход имя диапазона ячеек и возвращает список ячеек (в виде gm_containerCollection.
- Если именованных диапазонов несколько, то с помощью union я могу изящно получить объединение множест ячеек.
- Функция minus бывает полезна, когда пользователь задает именованную область ячеек, которые должны исключаться из обработки, внутри другой именнованной области ячеек, которые должны обрабатываться.
Старый 10.08.2007, 10:39   #8  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Андре Посмотреть сообщение
Функции высших порядков. Искать по ключевым словам - функциональное программирование, list comprehension, lambda-функции.

Если хочется быстро получить представление можно почитать здесь
http://ru.wikipedia.org/wiki/Функцио..._Питоне
Если я правильно понимаю, то эти функции работают со списками.

В Аксапте актуальные не списки, а записи в базе.
Поэтому в Аксапте мало функций для работы о списками, но много для работы с базой.
update_recordset вполне заменяет и map, и filter. По-моему.
__________________
полезное на axForum, github, vk, coub.
Старый 10.08.2007, 10:40   #9  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Андре Посмотреть сообщение
набор ячеек
А этот набор хранится в естественном для Аксапты виде? В таблице?
Если нет, то и инструменты требуются неестественные
__________________
полезное на axForum, github, vk, coub.
Старый 10.08.2007, 10:51   #10  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
Если я правильно понимаю, то эти функции работают со списками.
Да, со списками.

Цитата:
А этот набор хранится в естественном для Аксапты виде? В таблице?
Набор не хранится, и не может храниться. Задаются наименования диапазонов - 'дипазон1', 'диапазон2'. В каждом приходящем документе под этим диапазоном скрывается свой набор ячеек. Что это за набор - решает пользователь, который даже не знает о существовании Аксапты. Он просто знает, что если он хочет, чтобы нужные ему данные были обработаны "центральным суперкомпьютером", то надо открыть свой любимый инструмент (excel) и пометить нужные области в документе определенным образом.
Таким образом список ячеек получается только в момент прихода документа. В тот же момент значения этих ячеек определенным образом обрабатываются. После этого документ уходит из поля зрения Аксапты - хранить этот список далее смысла не имеет.

Но.... блин, мы опять пытаемся скатиться до обсуждения одного, конкретного применения идеи. Но применений может быть и больше.... Или все считают это не важным?
Старый 10.08.2007, 10:55   #11  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
думаю, что функции продвинутой работы со списками имеют смысл в языках, где нет доступа к реляционным СУБД.
Списки - это всего лишь способ хранить информацию.
__________________
полезное на axForum, github, vk, coub.
Старый 10.08.2007, 11:01   #12  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Кстати, раз уж мы опять вернулись к теме контейнерной коллекции, приведу немного "полезной критики". Меня очень сильно всегда волнует вопрос производительности
Так вот, несколько предложений (замечаний) по методам класса:

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;
}
Помимо этого, в класс итератора и энумератора я добавил доп. переменную conLength, в которую записывается длина (при удалении conLength--; надо сделать). Это позволит не пересчитывать длину контейнера на каждой итерации. Конечно, не сильно увеличит производительность, но все же.
Старый 10.08.2007, 11:01   #13  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
думаю, что функции продвинутой работы со списками имеют смысл в языках, где нет доступа к реляционным СУБД
Тебе виднее. К слову, метод union() который мы сейчас обсуждаем присутствует в Аксаптовском классе Set. И выполняет он то, же, что и мой метод, только над set-ом (который, по сути, тоже список), а не над контейнером. Но ведь в Аксапте есть СУБД и необходимости в функциях работы со списками нет, вот так парадокс....
Старый 10.08.2007, 11:07   #14  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
Кстати, раз уж мы опять вернулись к теме контейнерной коллекции, приведу немного "полезной критики".
Угу. Спасибо большое. Кстати, а первое исправление реально дает выигрыш в скорости? Хотя в любом случае, такая запись мне нравится больше.
Старый 10.08.2007, 11:11   #15  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Андре Посмотреть сообщение
Тебе виднее. К слову, метод union() который мы сейчас обсуждаем присутствует в Аксаптовском классе Set. И выполняет он то, же, что и мой метод, только над set-ом (который, по сути, тоже список), а не над контейнером. Но ведь в Аксапте есть СУБД и необходимости в функциях работы со списками нет, вот так парадокс....
Да. Убил бы...

Не встречал использование Set, но Аксаптовские Map и List активно используются при закрытии склада. По сути дела, вместо того, чтобы сделать нормальную работу с СУБД разработчик копирует записи в своп клиента и делает вид, что это оптимизация - ведь блокировок нет! А потом доблестно бьется за целостность информации и умирающим от натуги клиентом...

Убил бы...

Тоже наверное сделал человек, который пришел из спискоориентированных языков...
Причем ладно бы использовал уже существующий встроенный контейнер.
Дык нет, изобрели свои классы...

(Что-то я злой в последнее время... Завершаю оффтопик, извините)
__________________
полезное на axForum, github, vk, coub.
Старый 10.08.2007, 11:14   #16  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от Андре Посмотреть сообщение
Угу. Спасибо большое. Кстати, а первое исправление реально дает выигрыш в скорости? Хотя в любом случае, такая запись мне нравится больше.
Пред. ответ удалил.
Правильный ответ смотри по ссылке ниже:

Последний раз редактировалось kashperuk; 12.08.2007 в 16:54.
За это сообщение автора поблагодарили: vladz (1).
Старый 10.08.2007, 11:15   #17  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Цитата:
Сообщение от mazzy Посмотреть сообщение
думаю, что функции продвинутой работы со списками имеют смысл в языках, где нет доступа к реляционным СУБД.
Списки - это всего лишь способ хранить информацию.
По-моему здесь дело не в способе хранения информации, а в способе вычислений.
Кажется Пролог когда-то умел работать с реляционными БД.
Старый 10.08.2007, 11:15   #18  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
Что-то я злой в последнее время...
Ага, еще и раздражительный. Тоже заметил?
Старый 10.08.2007, 11:17   #19  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
Хм. Взялся проверить, чтобы не быть голословным.
Получается как раз наоборот.
Хе.... спасибо

Цитата:
Кажется Пролог когда-то умел работать с реляционными БД.
Да и Python умеет, и Haskell и Lisp....
Старый 10.08.2007, 11:17   #20  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Lucky13 Посмотреть сообщение
По-моему здесь дело не в способе хранения информации, а в способе вычислений.
Кажется Пролог когда-то умел работать с реляционными БД.
Чистый Пролог никогда не умел работать с БД. Особенно с реляционными. В реляционных БД очень тяжело реализуется концепция отката, которая используется для перебора вариантов.

Пролог - сугубо спискоориентированный язык.
__________________
полезное на axForum, github, vk, coub.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axaptabuilder: How to build Axapta application from XPO files stored in Visual Source Safe. Blog bot DAX Blogs 0 12.04.2007 16:10
axaptabuilder: How to build Axapta application from XPO files stored in Visual Source Safe. Blog bot DAX Blogs 0 22.11.2006 15:20
Говорят вышел SP2 для Axapta 3. Кто нибуть что знает на эту тему? soin DAX: Прочие вопросы 10 13.10.2003 10:43
Введение в Аксапту Роман Кошелев DAX: Прочие вопросы 0 18.12.2001 14:00

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 07:39.