added "autorequire"; preparing libraries for autorequire
[k8-xscheme:k8-xscheme.git] / lib / amb.scm
1 (xs:libinfo amb
2   (exports amb:init))
3
4
5 (define amb-fail '*)
6
7 (define (amb:init)
8   (set! amb-fail (lambda () (error "amb tree exhausted")))
9   #t)
10
11
12 (define-macro (amb #!rest alts)
13   `(let ([+prev-amb-fail amb-fail])
14      (call/cc
15       (lambda (+sk)
16         ,@(map (lambda (alt)
17                  `(call/cc
18                    (lambda (+fk)
19                      (set! amb-fail
20                        (lambda ()
21                          (set! amb-fail +prev-amb-fail)
22                          (+fk 'fail)))
23                      (+sk ,alt))))
24                alts)
25
26         (+prev-amb-fail)))))
27
28
29 (define (amb:require pred)
30   (if (not pred) (amb) #t))
31
32
33 (define-macro (bag-of e)
34   `(let ((+prev-amb-fail amb-fail)
35          (+results '()))
36      (if (call/cc
37           (lambda (+k)
38             (set! amb-fail (lambda () (+k #f)))
39             (let ((+v ,e))
40               (set! +results (cons +v +results))
41               (+k #t))))
42          (amb-fail))
43      (set! amb-fail +prev-amb-fail)
44      (reverse! +results)))