1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
;;test dynamic wind.
(define results '())
(define (collate obj)
(set! results (cons obj results)))
(define (display-results)
(for-each (lambda (x) (display x) (newline)) (reverse results)))
(define (f g h)
(dynamic-wind
(lambda () (collate 'b))
(lambda ()
(collate 'x)
(dynamic-wind
(lambda () (collate '-b))
(lambda ()
(let ((k #f))
(collate '-x)
(dynamic-wind
(lambda () (collate '--b1))
(lambda ()
(collate '--x1)
(g)
(collate '--y1))
(lambda () (collate '--a1)))
(dynamic-wind
(lambda () (collate '--b2))
(lambda ()
(collate '--x2)
(h)
(collate '--y2))
(lambda () (collate '--a2)))
(collate '-y)))
(lambda () (collate '-a)))
(collate 'y))
(lambda () (collate 'a))))
(define (t0)
(f (lambda () #f)
(lambda () #f)))
(define (t1)
(let ((k #f))
(f (lambda () (call/cc (lambda (kk) (set! k kk))))
(lambda () (if k (let ((kk k)) (set! k #f) (kk)))))))
(define (t2)
(with/fc (lambda (m e) #f)
(lambda () (f (lambda () (/ 1 0))
(lambda () #f)))))
;;the thing to watch out for is that b and a must always appear in
;;pairs and without interleaving unless the level (indicated by -)
;;deepens.
(set! results '())
(t0)
(display-results)
(set! results '())
(t1)
(display-results)
(set! results '())
(t2)
(display-results)
|