diff options
| author | 2024-12-31 14:56:25 -0500 | |
|---|---|---|
| committer | 2024-12-31 14:56:25 -0500 | |
| commit | 5633d49c3c7f97bc48e2034d3680a01ef48cca2a (patch) | |
| tree | 89434f1aea54213da7b25b07a1b090421ee0a7cb | |
| parent | simplify push-prompt and push-sub-continuation CPS commands (diff) | |
turn pure operations on metacontinuations into called procedures
| -rw-r--r-- | cps.scm | 39 | ||||
| -rw-r--r-- | test.scm | 16 |
2 files changed, 44 insertions, 11 deletions
@@ -139,12 +139,12 @@ (define cps:with-sub-kont (cps-closure '(prompt proc) 'γ 'κ (cps-apply '__split-γ - '(γ prompt) + '(kont γ prompt) 'γ (cps-kappa 'discarded - '(γ↑ γ↓) + '(kont+γ↑ γ↓) (cps-apply 'proc - `(cons* kont γ↑) + 'kont+γ↑ '__κ0 'γ↓))))) @@ -167,14 +167,22 @@ (let (length=> tail 2) => (prompt-part expr-part))) (let* ((new-prompt (gensym "p")) (new-metakont (gensym "γ")) + (cons*-metakont (gensym "γ")) (cps-expr (core->cps expr-part - `(cons* ,new-prompt ,kont ,new-metakont) - '__κ0))) + cons*-metakont + '__κ0)) + (cons*-expr (cps-apply + 'cons* + (list new-prompt kont new-metakont) + new-metakont + (cps-kappa 'ignored + (list cons*-metakont) + cps-expr)))) (core->cps prompt-part metakont (cps-kappa new-metakont (list new-prompt) - cps-expr)))) + cons*-expr)))) ;; (push-sub-cont e e) (after ((let (pair=> form) => (head tail)) (when (eq? head 'push-sub-continuation)) @@ -182,17 +190,26 @@ (let (length=> tail 2) => (sub-cont-part expr-part))) (let* ((sub-cont-reified (gensym "γ")) (sub-cont-from-eval (gensym "γ")) + (in-middle-sub-cont (gensym "γ")) (cps-expr (core->cps expr-part - `(in-middle ,sub-cont-reified - ,kont - ,sub-cont-from-eval) - '__κ0))) + in-middle-sub-cont + '__κ0)) + (in-middle-expr (cps-apply + 'in-middle + (list sub-cont-reified + kont + sub-cont-from-eval) + sub-cont-from-eval + (cps-kappa 'ignored + (list in-middle-sub-cont) + cps-expr))) + ) (core->cps sub-cont-part metakont (cps-kappa sub-cont-from-eval sub-cont-reified - cps-expr)))) + in-middle-expr)))) ;; (lambda formal expr) (after ((let (pair=> form) => (head tail)) (when (eq? head 'lambda)) @@ -98,3 +98,19 @@ '(pass (y) () __toplevel) (cps->sexpr (core->cps '(if 'x y z))))) +(test-group "delimited continuation syntax" + (test "push-prompt" + '(pass (x) () + (kappa (__p1) __γ2 + (apply cons* (__p1 __toplevel __γ2) __γ2 + (kappa (__γ3) ignored + (pass (y) __γ3 __κ0))))) + (cps->sexpr (core->cps '(push-prompt x y)))) + (test "push-sub-continuation" + '(pass (x) () + (kappa __γ1 __γ2 + (apply in-middle (__γ1 __toplevel __γ2) __γ2 + (kappa (__γ3) ignored + (pass (y) __γ3 __κ0))))) + (cps->sexpr (core->cps '(push-sub-continuation x y))))) + |
