File: wind.scm

package info (click to toggle)
sisc 1.16.6-1.3
  • links: PTS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 8,492 kB
  • sloc: lisp: 69,834; xml: 19,482; java: 17,841; sh: 125; makefile: 56
file content (64 lines) | stat: -rw-r--r-- 1,386 bytes parent folder | download | duplicates (3)
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)