~ chicken-r7rs (master) /scheme.eval.scm
Trap1(module scheme.eval (eval environment)
2 (import (rename scheme (eval %eval)))
3 (import chicken.base chicken.type)
4 (import r7rs-library)
5
6;;;
7;;; 6.12. Environments and evaluation
8;;;
9
10 (: eval (* (struct environment) -> *))
11
12 (define (eval expr env) (%eval expr env))
13
14 (: environment (#!rest list -> (struct environment)))
15
16 (define (environment . specs)
17 (let ((name (gensym "environment-module-")))
18 (define (delmod)
19 (and-let* ((modp (assq name ##sys#module-table)))
20 (set! ##sys#module-table (##sys#delq modp ##sys#module-table))))
21 (dynamic-wind
22 void
23 (lambda ()
24 ;; create module...
25 (%eval `(module ,name ()
26 (import r7rs) ; for `import`
27 ,@(map (lambda (spec)
28 `(import ,(fixup-import/export-spec spec 'environment)))
29 specs)))
30 (let ((mod (##sys#find-module name)))
31 (##sys#make-structure 'environment
32 (cons 'import specs)
33 (let ((env (##sys#slot mod 13)))
34 (append (car env) (cdr env))) ; combine env and syntax bindings
35 #t)))
36 ;; ...and remove it right away
37 delmod)))
38
39)