diff --git a/collects/raclog/raclog.rkt b/collects/raclog/raclog.rkt index d2dcb17cf1..9e78ae3a1f 100644 --- a/collects/raclog/raclog.rkt +++ b/collects/raclog/raclog.rkt @@ -17,11 +17,11 @@ (syntax-rules () ((%or g ...) (lambda (__fk) - (let/cc __sk - (let/cc __fk - (__sk ((logic-var-val* g) __fk))) - ... - (__fk 'fail)))))) + (let/raclog-cc __sk + (let/raclog-cc __fk + (__sk ((logic-var-val* g) __fk))) + ... + (__fk 'fail)))))) (define-syntax %and (syntax-rules () @@ -48,18 +48,18 @@ ((%rel (v ...) ((a ...) subgoal ...) ...) (lambda __fmls (lambda (__fk) - (let/cc __sk - (let ((this-! (lambda (fk1) __fk))) - (syntax-parameterize - ([! (make-rename-transformer #'this-!)]) - (%let (v ...) - (let/cc __fk - (let* ((__fk ((%= __fmls (list a ...)) __fk)) - (__fk ((logic-var-val* subgoal) __fk)) - ...) - (__sk __fk))) - ... - (__fk 'fail)))))))))) + (let/raclog-cc __sk + (let ((this-! (lambda (fk1) __fk))) + (syntax-parameterize + ([! (make-rename-transformer #'this-!)]) + (%let (v ...) + (let/raclog-cc __fk + (let* ((__fk ((%= __fmls (list a ...)) __fk)) + (__fk ((logic-var-val* subgoal) __fk)) + ...) + (__sk __fk))) + ... + (__fk 'fail)))))))))) (define %fail (lambda (fk) (fk 'fail))) @@ -110,8 +110,8 @@ (define ((make-negation p) . args) ;basically inlined cut-fail (lambda (fk) - (if (let/cc k - ((apply p args) (lambda (d) (k #f)))) + (if (let/raclog-cc k + ((apply p args) (lambda (d) (k #f)))) (fk 'fail) fk))) @@ -142,8 +142,8 @@ (define (%not g) (lambda (fk) - (if (let/cc k - ((logic-var-val* g) (lambda (d) (k #f)))) + (if (let/raclog-cc k + ((logic-var-val* g) (lambda (d) (k #f)))) (fk 'fail) fk))) (define (%empty-rel . args) @@ -178,8 +178,8 @@ (syntax-rules () ((%free-vars (v ...) g) (make-goal-with-free-vars - (list v ...) - g)))) + (list v ...) + g)))) (define ((make-bag-of kons) lv goal bag) (let ((fvv '())) @@ -190,15 +190,15 @@ (define (make-bag-of-aux kons fvv lv goal bag) (lambda (fk) - (let/cc sk - (let ((lv2 (cons fvv lv))) - (let* ((acc '()) - (fk-final - (lambda (d) - (sk ((separate-bags fvv bag acc) fk)))) - (fk-retry (goal fk-final))) - (set! acc (kons (logic-var-val* lv2) acc)) - (fk-retry 'retry)))))) + (let/raclog-cc sk + (let ((lv2 (cons fvv lv))) + (let* ((acc '()) + (fk-final + (lambda (d) + (sk ((separate-bags fvv bag acc) fk)))) + (fk-retry (goal fk-final))) + (set! acc (kons (logic-var-val* lv2) acc)) + (fk-retry 'retry)))))) (define (separate-bags fvv bag acc) (let ((bags (let loop ((acc acc) @@ -230,30 +230,35 @@ (%and (%set-of x g s) (%= s (cons (_) (_))))) -(define *more-k* (box 'forward)) (define *more-fk* (box (λ (d) (error '%more "No active %which")))) (define-syntax %which (syntax-rules () ((%which (v ...) g) - (%let (v ...) - (let/cc __qk - (set-box! *more-k* __qk) - (set-box! *more-fk* - ((logic-var-val* g) - (lambda (d) - (set-box! *more-fk* #f) - ((unbox *more-k*) #f)))) - ((unbox *more-k*) - (list (cons 'v (logic-var-val* v)) - ...))))))) + (with-raclog-prompt + (%let (v ...) + (set-box! *more-fk* + ((logic-var-val* g) + (lambda (d) + (set-box! *more-fk* #f) + (abort-to-raclog-prompt #f)))) + (abort-to-raclog-prompt + (list (cons 'v (logic-var-val* v)) + ...))))))) (define (%more) - (let/cc k - (set-box! *more-k* k) - (if (unbox *more-fk*) - ((unbox *more-fk*) 'more) - #f))) + (with-raclog-prompt + (if (unbox *more-fk*) + ((unbox *more-fk*) 'more) + #f))) + +(define raclog-prompt-tag (make-continuation-prompt-tag 'raclog)) +(define (abort-to-raclog-prompt a) + (abort-current-continuation raclog-prompt-tag (λ () a))) +(define-syntax-rule (with-raclog-prompt e ...) + (call-with-continuation-prompt (λ () e ...) raclog-prompt-tag)) +(define-syntax-rule (let/raclog-cc k e ...) + (call-with-current-continuation (λ (k) e ...) raclog-prompt-tag)) (define (%member x y) (%let (xs z zs)