Re[4]: Как определить принадлежность генерику?
От: dsorokin Россия  
Дата: 20.04.10 16:45
Оценка: 138 (1)
Здравствуйте, VladD2, Вы писали:

VD>А вообще, если код не закрыт, то лучше дал бы ссылку на него или прислал бы мне преокт, а я бы поглядел и подправил.


Я могу прислать старый, но гораздо интереснее новый, о котором ниже. Кстати, куда его слать? Лицензия BSD как у поляков.

VD>Жаль. Надо будет посмотреть, может можно что-то в компиляторе подправить, чтобы он пропускал такой синтаксис.


Пока остановился на defcomp и тому подобном. Comp можно воспринимать как сокращение от computation или comprehension.

VD>Можно сделать так:

VD>
VD>  public macro @bind (_expr)
VD>  syntax ("!!", "def", _expr) { <[ () ]> }
VD>

VD>и соответственно использование:
VD>
VD>!!def a = ...;
VD>


Фу, восклицательные знаки впереди не ком-иль-фо.

Сейчас у меня обрабатываются конструкции 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.

Вот, рабочий пример:

    def coll = 
      comp enumerable
      {
        mutable i = 0;
        while (i < x)
        {
          yield i;
          i ++;
        }
      }


Можно использовать и yieldcomp. Тогда будет подставляться вся подпоследовательность. Потом постараюсь найти интересные примеры.

List comprehension выглядит как comp list {...}. Array comprehension — comp array {...}. Enumerable — comp enumerable {...}. Общая схема — comp builder {...}, где builder должен быть объектом, реализующим нужные методы как в F#. Генерацию можно переопределить.

Что касается производительности. List comprehension эффективен также как и встроенный в Nemerle. Используется та же самая техника с аккумулятором. Макрос здесь не имеет накладных расходов. Array comprehension эффективен. Тоже используется аккумулятор. Enumerable comprehension сложнее. Там создаются временные подпоследовательности. Но думаю, что скорость терпима.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.