Здравствуйте, dsorokin, Вы писали:
D>Я могу прислать старый, но гораздо интереснее новый, о котором ниже. Кстати, куда его слать? Лицензия BSD как у поляков.
Если мне, то можно на мыло (в профиле).
Если есть желание сделать это дело доступным для всех, то лучше всего просто расположить код в каталоге
snippets. Для того чтобы можно было менять немерловый SVN нужно прислать мне на мыло гуглевый эканут. Я добавлю его в список разработчиков.
D>Пока остановился на defcomp и тому подобном. Comp можно воспринимать как сокращение от computation или comprehension.
Ну, в общем-то это все ерунда. Синтаксис можно потом улучшить. Главное чтобы это все работало как надо.
D>Фу, восклицательные знаки впереди не ком-иль-фо.
А мне нравится! (с)
D>Сейчас у меня обрабатываются конструкции def, defcomp (let! в F#), mutable, return, returncomp (return! в F#), yield, yieldcomp (yield! в F#), if, when, unless и while. Сделал list, array и enumerable comprehension по аналогии с F#. Enumerable значит, что генерится значение типа IEnumerable[T]. В F# это будет seq.
list comprehension и так был, только реализован напрямую в виде макроса:
http://nemerle.googlecode.com/svn/nemerle/trunk/macros/Util.n (смотри module ListComprehensionHelper)
D>Вот, рабочий пример:
D>D> def coll =
D> comp enumerable
D> {
D> mutable i = 0;
D> while (i < x)
D> {
D> yield i;
D> i ++;
D> }
D> }
D>
Прикольно!
Вот видишь, а ты сомневался, что на макросах такое возможно
.
Я правильно понимаю, что coll будет иметь тип IEnumerable[int]?
D>Можно использовать и yieldcomp. Тогда будет подставляться вся подпоследовательность.
Вот тут я разницу не уловил.
D>Потом постараюсь найти интересные примеры.
D>List comprehension выглядит как comp list {...}. Array comprehension — comp array {...}. Enumerable — comp enumerable {...}. Общая схема — comp builder {...}, где builder должен быть объектом, реализующим нужные методы как в F#. Генерацию можно переопределить.
D>Что касается производительности. List comprehension эффективен также как и встроенный в Nemerle. Используется та же самая техника с аккумулятором.
Думаю, встроенный будет все же несколько эффективнее, так как он переписывается в чистые циклы.
D> Макрос здесь не имеет накладных расходов. Array comprehension эффективен. Тоже используется аккумулятор. Enumerable comprehension сложнее. Там создаются временные подпоследовательности. Но думаю, что скорость терпима.
Что за подпоследовательности?