Download - 2.3 Representation Strategies for Data Types
![Page 1: 2.3 Representation Strategies for Data Types](https://reader035.vdocuments.mx/reader035/viewer/2022071807/56812c61550346895d90f4d1/html5/thumbnails/1.jpg)
Environment: Data type associating symbols with values
{ a: 4 s: 'foo f: x.x }
Interface:
(empty-env) = [Ø]
(apply-env [f] s) = f(s)
(extend-env '(s1 ... s
k) '( v
1 ... v
k) [f]) = [g]
where g(s') = vi if s' = s
i for some i, 1 ≤ i ≤ k
= f (s') otherwise
2.3 Representation Strategies for Data Types
![Page 2: 2.3 Representation Strategies for Data Types](https://reader035.vdocuments.mx/reader035/viewer/2022071807/56812c61550346895d90f4d1/html5/thumbnails/2.jpg)
Example:
> (define dxy-env
(extend-env '(d x) '(6 7)
(extend-env '(y) '(8)
(empty-env))))
> (apply-env dxy-env 'x)
7
![Page 3: 2.3 Representation Strategies for Data Types](https://reader035.vdocuments.mx/reader035/viewer/2022071807/56812c61550346895d90f4d1/html5/thumbnails/3.jpg)
A constructor builds a datatype: empty-env, extend-env
An observer extracts info from a datatype: apply-env
We will consider three representations for environments:
Procedural
Abstract Syntax Tree
“Alternative” (list-based)
![Page 4: 2.3 Representation Strategies for Data Types](https://reader035.vdocuments.mx/reader035/viewer/2022071807/56812c61550346895d90f4d1/html5/thumbnails/4.jpg)
In Scheme, procedures (functions) are first-class objects: can be passed to / returned from other procedures, and stored in data structures
E.g., we can represent numbers as procedures:
[0] = s.z.z
[1] = s.z.(s z)
[2] = s.z. (s (s z))
[succ] = n.s.z. (s (n s z))
Now compute (succ 0) ....
![Page 5: 2.3 Representation Strategies for Data Types](https://reader035.vdocuments.mx/reader035/viewer/2022071807/56812c61550346895d90f4d1/html5/thumbnails/5.jpg)
Environment as procedure:
(define empty-env
(lambda ()
(lambda (sym)
(eopl:error 'apply-env
“No binding for ~s” sym))))
An environment is a function that takes a symbol and returns its assoicated value.
Empty environment defines no symbols.
Therefore empty environment returns an error if you try to apply it to a symbol
![Page 6: 2.3 Representation Strategies for Data Types](https://reader035.vdocuments.mx/reader035/viewer/2022071807/56812c61550346895d90f4d1/html5/thumbnails/6.jpg)
Environment as procedure:
(define apply-env
(lambda (env sym)
(env sym)))
So apply-env is really just “syntactic sugar”
![Page 7: 2.3 Representation Strategies for Data Types](https://reader035.vdocuments.mx/reader035/viewer/2022071807/56812c61550346895d90f4d1/html5/thumbnails/7.jpg)
Environment as procedure:
(define extend-env
(lambda (syms vals env)
(lambda (sym)
; get position of sym in syms
(let ((pos (list-find-pos sym syms)))
(if (number? pos) ; we found it!
; return value at that pos
(list-ref vals pos)
; not found; use current env
(apply-env env sym))))))
![Page 8: 2.3 Representation Strategies for Data Types](https://reader035.vdocuments.mx/reader035/viewer/2022071807/56812c61550346895d90f4d1/html5/thumbnails/8.jpg)
Examples:
> (define xy-env
(extend-env '(x y) '(3 4) (empty-env)))
> xy-env
#<procedure:13:7>
> (apply-env xy-env 'y)
4
> (apply-env xy-env 'z)
apply-env: No binding for z
![Page 9: 2.3 Representation Strategies for Data Types](https://reader035.vdocuments.mx/reader035/viewer/2022071807/56812c61550346895d90f4d1/html5/thumbnails/9.jpg)
Environment as Abstract Syntax Tree:
<env-rep> ::= (empty-env)
empty-env-record
::= (extend-env ({<symbol>}*)
({<value>}*)
<env-rep>)
extended-env-record (syms vals env
![Page 10: 2.3 Representation Strategies for Data Types](https://reader035.vdocuments.mx/reader035/viewer/2022071807/56812c61550346895d90f4d1/html5/thumbnails/10.jpg)
extended-env-record
syms vals env
empty-env-record(x y) (3 4)
Environment as AST:
![Page 11: 2.3 Representation Strategies for Data Types](https://reader035.vdocuments.mx/reader035/viewer/2022071807/56812c61550346895d90f4d1/html5/thumbnails/11.jpg)
(define-datatype environment environment?
(empty-env-record)
(extended-env-record
(syms (list-of symbol?))
(vals (list-of scheme-value?))
(env environment?)))
(define scheme-value? (lambda (v) #t)
> ((list-of number?) '(1 2 3))
#t
Environment as AST:
![Page 12: 2.3 Representation Strategies for Data Types](https://reader035.vdocuments.mx/reader035/viewer/2022071807/56812c61550346895d90f4d1/html5/thumbnails/12.jpg)
(define empty-env
(lambda ()
(empty-env-record)))
(define extend-env
(lambda (syms vals env)
(extended-env-record syms vals env)))
Environment as AST:
![Page 13: 2.3 Representation Strategies for Data Types](https://reader035.vdocuments.mx/reader035/viewer/2022071807/56812c61550346895d90f4d1/html5/thumbnails/13.jpg)
(define apply-env
(lambda (env sym)
(cases environment env
(empty-env-record ()
(eopl:error ...))
(extended-env-record (syms vals env)
(let ((pos (list-find-pos sym syms)))
(if (number? pos)
(list-ref vals pos)
(apply-env env sym)))))))
Environment as AST:
![Page 14: 2.3 Representation Strategies for Data Types](https://reader035.vdocuments.mx/reader035/viewer/2022071807/56812c61550346895d90f4d1/html5/thumbnails/14.jpg)
Alternative (List) Representation
Actually the most intuitive:
<env-rep> ::= ()
::= (({<symbol>}*) ({<value>}*) <env-rep>)
(define empty-env
(lambda ()
'()))
(define extend-env
(lambda (syms vals env)
(cons (list syms vals) env)))
![Page 15: 2.3 Representation Strategies for Data Types](https://reader035.vdocuments.mx/reader035/viewer/2022071807/56812c61550346895d90f4d1/html5/thumbnails/15.jpg)
Alternative Representation
(define apply-env
(lambda (env sym)
(if (null? env)
(eopl:error ...)
(let (syms (car (car env)))
(vals (cadr (car env)))
(env (cdr env)))
(let ((pos (rib-find-pos sym syms)))
(if (number? pos)
(list-ref vals pos)
(apply-env env sym)))))))
(define rib-find-pos list-find-pos)
![Page 16: 2.3 Representation Strategies for Data Types](https://reader035.vdocuments.mx/reader035/viewer/2022071807/56812c61550346895d90f4d1/html5/thumbnails/16.jpg)
Alternative Representation: Ribcage
d x 6 7
8y
(define dxy-env (extend-env '(d x) '(6 7) (extend-env '(y) '(8) (empty-env))))