-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdumb-1parent-env.lisp
49 lines (40 loc) · 1.44 KB
/
dumb-1parent-env.lisp
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
39
40
41
42
43
44
45
46
47
48
49
;;;; dumb-1parent-env.lisp
;;;; req. flat-env
(in-package #:mother)
(defclass dumb-1parent-env (environment)
((assoc :accessor dumb-assoc :initarg :assoc)
(parent :accessor dumb-parent :initarg :parent)))
(defun bindings->dumb-1parent-env (bindings parent)
(make-instance 'dumb-1parent-env
:assoc bindings
:parent parent))
(defmethod lookup ((env dumb-1parent-env) key)
(multiple-value-bind (val bound?)
(assoc-value (dumb-assoc env) key :test #'eq)
(if bound?
(values val bound?)
(lookup (dumb-parent env) key))))
(defmethod flat-lookup ((env dumb-1parent-env) key)
(assoc-value (dumb-assoc env) key :test #'eq))
(defmethod (setf flat-lookup) (val (env dumb-1parent-env) key)
(setf (assoc-value (dumb-assoc env) key :test #'eq) val))
#||
(defclass dumb-1parent-env (environment)
((flat :accessor dumb-flat :initarg :flat
:type flat-env)
(parent :accessor dumb-parent :initarg :parent)))
(defun bindings->dumb-1parent-env (bindings parent)
(make-instance 'dumb-1parent-env
:flat (bindings->flat-env bindings)
:parent parent))
(defmethod lookup ((env dumb-1parent-env) key)
(multiple-value-bind (val bound?)
(flat-lookup (dumb-flat env) key)
(if bound?
(values val bound?)
(lookup (dumb-parent env) key))))
(defmethod flat-lookup ((env dumb-1parent-env) key)
(flat-lookup (dumb-flat env) key))
(defmethod (setf flat-lookup) (val (env dumb-1parent-env) key)
(setf (flat-lookup (dumb-flat env) key) val))
||#