[Nemerle] Расширения библиотеки макросов
От: Алексей П Россия  
Дата: 21.10.06 11:25
Оценка:
Предлагаю внести в "стандартную" библиотеку макросов 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.