aboutsummaryrefslogtreecommitdiff
path: root/module/c/eval/environment.scm
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))