1 / 16

2.3 Representation Strategies for Data Types

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 ]

vera-bray
Télécharger la présentation

2.3 Representation Strategies for Data Types

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 2.3 Representation Strategies for Data Types • Environment: Data type associating symbols with values • { a: 4 s: 'foo f: lx.x } • Interface: • (empty-env) = [Ø] • (apply-env [f] s) = f(s) • (extend-env '(s1 ... sk) '(v1 ... vk) [f]) = [g] • where g(s') = vi if s' = si for some i, 1 ≤ i ≤ k • = f (s') otherwise

  2. Example: • > (define dxy-env • (extend-env '(d x) '(6 7) • (extend-env '(y) '(8) • (empty-env)))) • > (apply-env dxy-env 'x) • 7

  3. 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)

  4. Procedural representation of environments • 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] = ls.lz.z • [1] = ls.lz.(s z) • [2] = ls.lz. (s (s z)) • [succ] = ln.ls.lz. (s (n s z)) • Now compute (succ 0) ....

  5. 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

  6. Environment as procedure: (define apply-env (lambda (env sym) (env sym))) So apply-env is really just “syntactic sugar”

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

  8. 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

  9. Environment as Abstract Syntax Tree: <env-rep> ::= (empty-env) empty-env-record ::= (extend-env ({<symbol>}*) ({<value>}*) <env-rep>) extended-env-record (syms vals env

  10. Environment as AST: extended-env-record syms env vals (x y) (3 4) empty-env-record

  11. Environment as AST: (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

  12. Environment as AST: (define empty-env (lambda () (empty-env-record))) (define extend-env (lambda (syms vals env) (extended-env-record syms vals env)))

  13. Environment as AST: (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)))))))

  14. 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)))

  15. 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)

  16. Alternative Representation: Ribcage (define dxy-env (extend-env '(d x) '(6 7) (extend-env '(y) '(8) (empty-env)))) d x 6 7 y 8

More Related