2.3 representation strategies for data types

16
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 '(s 1 ... s k ) '( v 1 ... v k ) [f]) = [g] where g(s') = v i if s' = s i for some i, 1 ≤ i k = f (s') otherwise 2.3 Representation Strategies for Data Types

Upload: vera-bray

Post on 30-Dec-2015

13 views

Category:

Documents


0 download

DESCRIPTION

2.3 Representation Strategies for Data Types. Environment : Data type associating symbols with values { a : 4 s :'foo f : l x.x } Interface: (empty-env) = [ Ø ] (apply-env [ f ] s ) = f ( s ) (extend-env '( s 1 ... s k ) '( v 1 ... v k ) [ f ] ) = [ g ] - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 2.3  Representation Strategies for Data Types

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

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

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

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

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

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

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

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

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

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

(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

(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

(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

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

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

Alternative Representation: Ribcage

d x 6 7

8y

(define dxy-env (extend-env '(d x) '(6 7) (extend-env '(y) '(8) (empty-env))))