Javascript CPS(继续传递样式)实现

时间:2009-11-30 17:02:21

标签: javascript implementation continuations

由于an article in IBM Developer Works about CPS (continuation passing style),我试图不使用“return”。

没有CPS

function getter() {
    * calculate a*
    return a;
}
function test() {
    *part 1*
    if(*condition*) {
         a = getter();
    }
    *use a*
    *part 2*
}

过渡

功能的其余部分

    }
    *use a*
    *part 2*

使用CPS

function getter() {
    * calculate a*
    continuationtest(a);
}
function test() {
    *part 1*
    if (*condition*) {
        getter();
}
function continuationtest(a) {
    }
    *use a*
    *part 2*
}

问题

循环以函数的其余部分结束。

解决方案是什么?

2 个答案:

答案 0 :(得分:6)

延续传递风格与JavaScript循环不能很好地融合。你需要找到另一种方法来进行循环。

请注意,您的代码的解释如下:

function test() {
    *part 1*
    if (*condition*) {
        getter();
    }                               // <--- note indentation here
    function continuationtest(a) {  // <--- and here
    }
    *use a*
    *part 2*
}

所以你现在根本没有使用延续传递风格。当getter()调用continuationtest()时,它可能会失败,因为continuationtest()不在那里。

带循环的CPS示例可能如下所示。

没有CPS

function doSomething(i) {
    alert("doing " + i);
}

function doLoop() {
    for (i = 0; i < 9; i++)
        doSomething(i);
}

使用CPS

function doSomething(i, ctn) {
    alert("doing " + i);
    ctn();
}

function doLoop() {
    doLoopStartingAt(0);

    function doLoopStartingAt(i) {
        if (i < 9)
            doSomething(i, function ctn() { doLoopStartingAt(i + 1); });
    }
}

(CPS的优势在于,您可以在任何时候使用setTimeout()来延迟执行其余操作,或者等待处理用户输入,或者避免浏览器显示“慢速脚本”弹出窗口。 )

答案 1 :(得分:0)

你有一个错字:

function continuationtest(a) {
    }
    *use a*
    *part 2*
}

这可能是你想要的:

function continuationtest(a) {
    *use a*
    *part 2*
}

除此之外,很难提供如此少的信息,例如continuationtest中会发生的事情,因为如果您仍然遇到问题,这可能是至关重要的。