タイトル未定

function facto(n){
    if(n == 0){
        return 1;
    }else{
        return n * facto(n - 1);
    }
}

facto(5); //=> 120
// Task: 無引数関数で呼ぶとTaskかfalseが返る
function tFinal(){
    return false;
}

// Continuation: 1引数関数で、呼ぶとTaskが返る
var result;
function cFinal(x){
    result = x;
    return tFinal;
}

// Main loop
var task = tFinal;
while(task){
    task = task()
}
function facto(n){
    if(n == 0){
        return 1;
    }else{
        return n * facto(n - 1);
    }
}

// Task: 無引数関数で呼ぶとTaskかfalseが返る
function tFinal(){
    return false;
}

function makeTFacto(n, cont){
    return function tFacto(){
        if(n == 0){
            return cont(n)
        }else{
            return cont(n * facto(n - 1))
        }
    }
}
// Continuation: 1引数関数で、呼ぶとTaskが返る
var result;
function cFinal(x){
    result = x;
    return tFinal;
}

// Main loop
var task = makeTFacto(5, cFinal);
while(task){
    console.log(task);
    task = task()
}

console.log(result);
-----
tFacto()
tFinal()
120
// Task: 無引数関数で呼ぶとTaskかfalseが返る
function tFinal(){
    return false;
}

function makeTFacto(n, cont){
    return function tFacto(){
        if(n == 0){
            return cont(1)
        }else{
            var cont2 = makeCMul(n, cont);
            return makeTFacto(n - 1, cont2);
        }
    }
}

function makeCMul(n, cont){
    return function cMul(m){
        cont(n * m)
    }
}
// Continuation: 1引数関数で、呼ぶとTaskが返る
var result;
function cFinal(x){
    result = x;
    return tFinal;
}

// Main loop
var task = makeTFacto(5, cFinal);
while(task){
    console.log(task);
    task = task()
}

console.log(result);
-----
tFacto()
tFacto()
tFacto()
tFacto()
tFacto()
tFacto()
120

これがCPSだという理解で正しいですか?>くわしいひと