; continuation-sample.scm (define (print-table l) (call/cc (lambda (escape) (set! not-a-number escape) (map print-sqrt-abs l)))) (define (print-sqrt-abs x) (write (sqrt (abs (must-be-number x)))) (newline)) (define (must-be-number x) (if (number? x) x (not-a-number "huh?"))) (define (map fn l) (if (null? l) () (cons (fn (car l)) (map fn (cdr l))))) (define backtrack-points ()) (define (choose-first f g) (call/cc (lambda (k) (set! backtrack-points (cons (lambda () (k (g))) backtrack-points)) (f)))) (define (random-choice f g) (if (= 1 (random 2)) (choose-first f g) (choose-first g f))) (define (fail) (let ((last-choice (car backtrack-points))) (set! backtrack-points (cdr backtrack-points)) (last-choice))) (define (integer) (random-choice (lambda () 1) (lambda () (+ 1 (integer))))) (define (even) (let ((n (integer))) (if (even? n) n (fail)))) (define (iter f n) (write (f)) (newline) (if (> n 0) (iter f (- n 1)))) (define (integer) (ambiguous 1 (+ 1 (integer))))