-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathenv.scm
39 lines (31 loc) · 1007 Bytes
/
env.scm
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
35
36
37
38
;;;; env.scm
;;;;
;;;; Environment management.
;; Defines a lisp environment.
(define-record-type lisp-env
(make-lisp-env defs stack)
lisp-env?
(defs lisp-env/get-defs)
(stack lisp-env/get-stack lisp-env/set-stack!))
;; Makes a new environment
(define (make-env)
(make-lisp-env (make-hash-table) '()))
;; Adds a new symbol to the environment with the given form.
(define (env/add-def! env symbol form)
(hash-table-set! (lisp-env/get-defs env) symbol form)
env)
(define (env/get-def env symbol)
(hash-table-ref/default (lisp-env/get-defs env) symbol 'error))
;;;
;;; Stack functions
;;;
;;; These will push/pop objects off the environment stack.
;;;
(define (env/pop! env)
(let ((element (car (lisp-env/get-stack env))))
(lisp-env/set-stack! env (cdr (lisp-env/get-stack env)))
element))
(define (env/push! env val)
(lisp-env/set-stack! env (append (list val) (lisp-env/get-stack env))))
(define (env/stack-empty? env)
(null? (lisp-env/get-stack env)))