(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))