Описание тега continuation-passing

В функциональном программировании стиль передачи продолжения (CPS) - это стиль программирования, в котором управление передается явно в форме функции (функций) продолжения.

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

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

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

Иногда для каждого вызова используется более одного продолжения, например, с двумя продолжениями, одно для "успешного" вычисления, другое для "неудачного".

Пример:

nlog(n, x, onSuccess, onFailure) =            (* iterated logarithm *)
     onFailure(x)                      , if x <= 0 or n < 0
     onSuccess(x)                      , if n == 0
     onSucess(log(x))                  , if n == 1
     nlog(n-1, x, 
           x => onSuccess(log(x)),            (* new success continuation constructed *)
           onFailure                          (* same failure continuation *)
           )                           , otherwise