问题
This code works as expected:
(define saved #f)
(cons 'wo (call/cc (lambda (k) (set! saved k) '())))
(saved 'ca!)
output (Racket console):
'(wo)
'(wo . ca!)
But when I wrap it in a function and call it, the program never stops. Why?
(define (test)
(define saved #f)
(cons 'wo (call/cc (lambda (k) (set! saved k) '())))
(saved 'ca!))
(test)
回答1:
A continuation is all that's left to be done in the execution context where it's saved.
In the first case, the continuation is saved when calling cons
, so it's just to cons 'wo to something and return to the REPL.
In the second case, you call procedure test
, so the continuation is both
- cons 'wo to something
- call the procedure bound to
saved
(i.e. the continuation) with 'ca!
so the continuation calls itself, hence the loop.
来源:https://stackoverflow.com/questions/25339956/scheme-continuation-whats-the-difference-between-call-call-cc-in-top-level-a