Re[5]: Как определить принадлежность генерику?
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.04.10 17:32
Оценка:
Здравствуйте, 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 сложнее. Там создаются временные подпоследовательности. Но думаю, что скорость терпима.


Что за подпоследовательности?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.