blob: 12eefaf74a83e876751446706699c04139c21e75 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
(define-module (c eval environment)
:use-module (srfi srfi-1)
:export (make-environment
env-set! env-ref push-frame! pop-frame!))
(define (make-frame)
(make-hash-table))
(define (make-environment)
(list (make-frame)))
;; Returns an updated environment, linear update
(define (env-set! env key value)
;; get handle to differentiate #f
;; (even though #f should never be stored since it's not a C value)
(cond ((find (lambda (frame) (hashq-get-handle frame key)) env)
=> (lambda (frame) (hashq-set! frame key value)))
(else (hashq-set! (car env) key value)))
env)
(define (env-ref env key)
(cond ((null? env)
(scm-error 'misc-error "env-ref"
"~s unbound"
(list key)
#f))
((hashq-get-handle (car env) key) => cdr)
(else (env-ref (cdr env) key))))
(define (push-frame! environment)
(cons (make-frame) environment))
(define (pop-frame! environment)
(cdr environment))
|