【问题标题】:How to implement while loop in D?如何在D中实现while循环?
【发布时间】:2011-07-14 02:27:07
【问题描述】:

我知道 D 已经有 while 循环,但由于它的高级功能,我想看看如果在代码中实现 while 循环会是什么样子。

动机:accepted answer 对此问题的 SO。

【问题讨论】:

  • n.b. -- 如果有人想知道,被称为动机的答案是关于 Haskell,我认为这就是为什么会这样标记。
  • @camccann 是的。我已经开始学习 Haskell,而且我知道的足够多的 D 让我想看看 D 中实现的 while 循环只是为了比较。
  • 没关系。只是不清楚为什么它被标记为 [haskell] 的问题,评论是针对阅读问题的人,而不是你。虽然添加一些细节可能不会有什么坏处(例如,另一个问题有 Haskell 代码,您对比较感兴趣等)。
  • @Arlen:将问题标记为“Haskell”的目的是让对 Haskell 感兴趣的人关注该问题。这些人很惊讶问题与 Haskell 无关。

标签: while-loop d


【解决方案1】:

使用惰性函数参数:

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++;
    });
}

【讨论】:

    【解决方案2】:

    使用递归函数:(尾调用将得到优化;))

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

    应该使用闭包

    或使用过度/未充分使用的goto

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

    【讨论】:

    • “尾调用优化”[需要引用]?
    • @BCS 递归调用将转换为 goto 到函数的开头,并且在递归期间不会创建堆栈开销(这可以在不需要执行堆栈拆卸代码时完成返回)
    • 好吧,我想我是模棱两可的。我要说的是;这是 DMD 的实现细节还是 D 要求它完成? -- 如果是前者,那么符合标准的编译器可能会失败。如果是后者,请提供链接。
    • @BCS 任何经过优化的体面的编译器都可以做到这一点,但它确实是 DMD 的细节,而不是 D
    猜你喜欢
    • 2014-02-15
    • 2020-07-12
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多