next up previous
Next: 10.0.1 Chez Schemeでの実行 Up: ソフトウェア特論 講義資料 Scheme言語とインタプリタ Previous: 9.5 Call/CCの定義

10 continuationの例

先にあげたcontinuationのプログラム例 ですが,nilというシンボルは無いので,()で表記します.
; 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))))




generated through LaTeX2HTML. M.Inaba 平成18年5月6日