|20-CS-4003-001||Organization of Programming Languages||Fall 2018|
Escaping from a deeply nested procedure call
(define call/cc call-with-current-continuation) (define halt (call/cc (lambda (k) k))) (define proc (lambda () (if (procedure? halt) (letrec ((looper (lambda (n) (if (= n 1000) (halt n) (looper (+ n 1)))))) (looper 1)) halt)))
This is the same code as on the previous slide except that the
continuation is "grabbed" by halt in a define.
Thus the continuation is grabbed while the file is being loaded.
When (proc) is executed the following results:
;Loading "callcc.1.ss"... done ;Value: haltSo, the 1000 is returned to the call/cc of the (define halt which sends control back in time to the load process which is why the puzzling "Loading" output is seen and since halt is the last value obtained in the code ;Value: halt is printed. At this point try
prompt> halt ;Value: 1000which shows that proc really did execute and iterate 1000 times.