diff options
| author | 2024-12-31 18:58:20 -0500 | |
|---|---|---|
| committer | 2024-12-31 18:58:20 -0500 | |
| commit | 992bbec042facc6842aae02183ccd89d6c8f8749 (patch) | |
| tree | 4dd44592c8bac5e0e180da3e5e36573f814a9d63 | |
| parent | correctly pass closures in an argument list (diff) | |
| -rw-r--r-- | cps.scm | 16 | ||||
| -rw-r--r-- | test.scm | 8 |
2 files changed, 20 insertions, 4 deletions
@@ -306,14 +306,22 @@ (define prompt? integer?) +(define special-values '(__toplevel __unwind)) (define (eval-cps dynenv lexenv tmpenv expr) (define envs (mapping-union tmpenv lexenv dynenv)) (define (throw-error msg . others) - (apply error msg dynenv lexenv tmpenv expr others)) + (apply error msg + (mapping->alist dynenv) + (mapping->alist lexenv) + (mapping->alist tmpenv) + (cps->sexpr expr) + others)) (define (lookup key) - (mapping-ref envs key - (cut throw-error "invalid key"))) + (if (memq key special-values) + key + (mapping-ref envs key + (cut throw-error "invalid key" key)))) (define (eval-simple expr) (cond ((symbol? expr) (lookup expr)) @@ -366,7 +374,7 @@ (else (throw-error "invalid procedure" proc)))) (cond-thunk (receive-ct (args metakont kont) (cps-apply-kont=> expr) - (eval-kont kont + (eval-kont (eval-simple kont) (eval-args args) (eval-simple metakont))) (receive-ct (proc args metakont kont) (cps-apply=> expr) @@ -135,3 +135,11 @@ '(''#f) (e1 '''#f))) +(test-group "procedures" + (test-assert "closure" + (cps-closure? + (car (e1 '(lambda (x) x))))) + (test "apply closure" + '(5) + (e1 '((lambda (x) x) 5)))) + |
