Тип продолжения в Racket и определение текущего продолжения

Какой тип продолжения в Racket? А как определить текущее продолжение по вызову call/cc? (например: является ли правильной стратегией предположение, что текущим продолжением является то, что следует сразу после закрывающей скобки call/cc?)


person chamibuddhika    schedule 12.12.2014    source источник


Ответы (1)


Продолжение — это процедура (в том смысле, что она может быть вызвана и возвращает true для procedure?), хотя и особенная, которая не возвращается к вызывающей стороне продолжения.

Значения, с которыми вы вызываете продолжение, станут возвращаемыми значениями вызова call/cc, создавшего его.

Пример:

> (define $k #f)
> (call-with-values (lambda () (call/cc (lambda (k)
                                          (set! $k k))))
                    (case-lambda (() "Zero values")
                                 ((x) "One value")
                                 ((x y) "Two values")
                                 ((x y z) "Three values")))
"One value"
> (procedure? $k)
#t
> ($k)
"Zero values"
> ($k 1)
"One value"
> ($k 1 2)
"Two values"
> ($k 1 2 3)
"Three values"
> ($k 1 2 3 4)
#<case-lambda-procedure>: arity mismatch;
 the expected number of arguments does not match the given number
person Chris Jester-Young    schedule 13.12.2014