Здравствуйте, 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 сложнее. Там создаются временные подпоследовательности. Но думаю, что скорость терпима.