Предлагаю внести в "стандартную" библиотеку макросов Nemerle циклы forinc и fordec, грамотная реализация есть. Давно сделал это для себя, действительно удобно. Вот forinc:
macro @forinc (loop, body)
syntax("forinc", "(", loop, ")", body)
{
def (var, start, condition) = match(loop)
{
| <[ $(var : name) = $start .. $end ]> => (var, start, <[ $(var : name) <= $end ]>)
| <[ $(var : name) <= $_ ]>
| <[ $(var : name) < $_ ]> => (var, <[ 0 ]>, loop)
| e => Message.FatalError ($"the syntax is 'forinc(x = start .. end)' or 'forinc(x {< | <=} end)', got $e")
}
def loop = Nemerle.Macros.Symbol (Util.tmpname ("forinc_"));
<[
def $(loop : name) ($(var : name) : int)
{
match($(var : name))
{
| _ when $condition =>
$(Name.Global ("_N_break") : name) : {
$(Name.Global ("_N_continue") : name) : {
$body;
}
$(loop : name) ($(var : name) + 1)
}
| _ => ()
}
};
$(loop : name) ($start)
]>
}
fordec по аналогии, могу выдать.
Синтаксис такой:
forinc(iter = start .. end) // как в паскале
forinc(iter <= end) // [0, end]
forinc(iter < end) // [0, end)
Итератор неизменяемый, код генерится более оптимальный чем для while или for (за счет match c guard-ом вместо when, это тоже можнно бы подправить в when).
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
30.01.07 18:08: Перенесено модератором из 'Декларативное программирование' — IT