Ищем примеры "реального" использования продолжений - PullRequest
21 голосов
/ 29 августа 2008

Я пытаюсь понять концепцию продолжения, и я нашел несколько небольших обучающих примеров, подобных этому, из статьи Википедии :

(define the-continuation #f)

(define (test)
  (let ((i 0))
    ; call/cc calls its first function argument, passing 
    ; a continuation variable representing this point in
    ; the program as the argument to that function. 
    ;
    ; In this case, the function argument assigns that
    ; continuation to the variable the-continuation. 
    ;
    (call/cc (lambda (k) (set! the-continuation k)))
    ;
    ; The next time the-continuation is called, we start here.
    (set! i (+ i 1))
    i))

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

Так что я ищу более подробные примеры кода, которые продолжения могут предложить мне как программисту.

Ура!

Ответы [ 12 ]

1 голос
/ 31 января 2009

Как насчет Google Mapplets API ? Существует множество функций (все оканчивающиеся на Async), которым вы передаете обратный вызов. Функция API выполняет асинхронный запрос, получает его результат, а затем передает этот результат вашему обратному вызову (как «следующий шаг»). Очень похоже на стиль передачи продолжения для меня.

Этот пример показывает очень простой случай.

map.getZoomAsync(function(zoom) {
    alert("Current zoom level is " + zoom); // this is the continuation
});  
alert("This might happen before or after you see the zoom level message");

Так как это Javascript, нет оптимизации хвостового вызова , поэтому стек будет расти с каждым вызовом в продолжение, и вы в конечном итоге вернете нить управления браузеру. Тем не менее, я думаю, что это хорошая абстракция.

0 голосов
/ 05 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...