Call / CC с замыканиями - PullRequest
       24

Call / CC с замыканиями

5 голосов
/ 27 ноября 2011

Википедия упоминает, что «На любом языке, который поддерживает замыкания и правильные конечные вызовы, можно писать программы в стиле продолжения продолжения и вручную реализовывать call / cc.»

КакМожно ли реализовать эту функцию, например, в JavaScript?Я знаю, что JavaScript не делает TCO, но при условии, что пространство в стеке не заканчивается

Ответы [ 2 ]

1 голос
/ 27 ноября 2011

Невозможно написать реализацию call / cc в JavaScript:

JavaScript не удовлетворяет требованию «надлежащих вызовов хвоста» (без создания дополнительного стека).Тем не менее, я считаю, что форма продолжений, таких как найденная в Jetty, с использованием исключений возможна.«CPS» так же прост, как и передача функционального объекта, хотя в конечном итоге он также сталкивается с проблемами стека, если не происходит периодического возврата.

Удачное кодирование.

0 голосов
/ 24 декабря 2012

Да, это возможно. Смотрите этот вопрос . Вот как вы бы это реализовали:

Function.prototype.async = async;

function async() {
    setTimeout.bind(null, this, 0).apply(null, arguments);
}

function callcc(f, cc) {
    f.async(cc);
}

Тогда вы можете использовать его следующим образом:

pythagoras.async(3, 4, alert);

function pythagoras(x, y, cont) {
    callcc.async(square.bind(null, x), function cc(x_squared) {
        callcc.async(square.bind(null, y), function cc(y_squared) {
            add.async(x_squared, y_squared, cont);
        });
    });
}

function square(x, cont) {
    multiply.async(x, x, cont);
}

function multiply(x, y, cont) {
    cont.async(x * y);
}

function add(x, y, cont) {
    cont.async(x + y);
}

Вы можете поиграть с демо здесь: http://jsfiddle.net/brZrd/

...