Как реализовать цикл while в D? - PullRequest
5 голосов
/ 14 июля 2011

Я знаю, что D уже имеет цикл while, но из-за его расширенных возможностей я хотел бы посмотреть, как он будет выглядеть, если цикл while был реализован в коде.

мотивация: принятый ответ на этот вопрос по SO.

Ответы [ 2 ]

10 голосов
/ 14 июля 2011

Использование ленивых параметров функции:

void whileLoop(lazy bool cond, void delegate() loopBody) {
Begin:
    if(!cond) return;
    loopBody();
    goto Begin;
}

// Test it out.
void main() {
    import std.stdio;

    int i;
    whileLoop(i < 10, {
        writeln(i);
        i++;
    });
}
5 голосов
/ 14 июля 2011

с использованием функции с рекурсией: (хвостовой вызов будет оптимизирован;))

void whileLoop(bool delegate() cond,void delegate() fun){
    if(cond()){
        fun();
        whileLoop(cond,fun);
    }
}

замыкания следует использовать с этим

или с использованием чрезмерно / недоиспользованного goto

startloop:if(!condition)goto endloop;
//code
goto startloop;
endloop:;
...