26
1 Env. Model Implementation & Analyzer Practice Session #10

1 Env. Model Implementation & Analyzer Practice Session #10 Env. Model Implementation & Analyzer Practice Session #10

Embed Size (px)

DESCRIPTION

Env. model evaluator: Structure and implementation ASP Derived expressions Core Test Data structures Utils (a racket lib) Input text Data structures: New data structures: frame, environment A closure keeps the Env in which it has been created renaming and substitution functions are no longer needed

Citation preview

Page 1: 1 Env. Model Implementation & Analyzer Practice Session #10 Env. Model Implementation & Analyzer Practice Session #10

1

Env. Model Implementation & Analyzer

Practice Session #10

Page 2: 1 Env. Model Implementation & Analyzer Practice Session #10 Env. Model Implementation & Analyzer Practice Session #10

2

• Saves repeated renaming and substitution: explicit substitution is replaced by variable

bindings using new data structures (frame, environment).

• Can be utilized to gain further improvements that cannot be achieved using the

substitution model (The analyzer/compiler)

Efficiency:

Env. model evaluator: Introduction

Page 3: 1 Env. Model Implementation & Analyzer Practice Session #10 Env. Model Implementation & Analyzer Practice Session #10

Env. model evaluator: Structure and implementation

ASP

Derived expressions

Core

Test

Data structures

Utils(a racket lib)

Input text

Data structures:

• New data structures: frame, environment

• A closure keeps the Env in which it has been created

• renaming and substitution functions are no longer needed

Page 4: 1 Env. Model Implementation & Analyzer Practice Session #10 Env. Model Implementation & Analyzer Practice Session #10

Env. model evaluator: Structure and implementation

ASP

Derived expressions

TestUtils(a racket lib)

Input text

Core:

• Procedure application and evaluation of expressions is

done with respect to a certain environment.

CoreData structures

ASP: No changes here!

Page 5: 1 Env. Model Implementation & Analyzer Practice Session #10 Env. Model Implementation & Analyzer Practice Session #10

5

Env. model evaluator: Structure and implementation

Box, unbox:

• The global environment may change (E.g., by definitions).

• Values that may change should be boxed (similar to pointers).

'( (x foo) (4 <procedure(x) x>) )

• A variable-value mapping. Each variable is bound to a single value only.

Frame: Implemented as a substitution, i.e: as a list of 2 lists

Page 6: 1 Env. Model Implementation & Analyzer Practice Session #10 Env. Model Implementation & Analyzer Practice Session #10

Environment: Implemented as a list of boxed frames

• A finite sequence of frames in which the last frames is the-global-environment.

Env. model evaluator: Structure and implementation

E1

'((+ - …) (prim+ prim- …))

'((foo …) ( … ))

t-g-ebox-pointer diagram:

box

frame

frame

box

'proc params body

E2

E3

Page 7: 1 Env. Model Implementation & Analyzer Practice Session #10 Env. Model Implementation & Analyzer Practice Session #10

7

Env. model evaluator: Evaluation example (1)

Evaluating a definition expression:

(define env-eval (lambda (exp env) (cond ((atomic? exp) (eval-atomic exp env)) ((special-form? exp) (eval-special-form exp env)) ...)))

> (env-eval (derive '(define f (lambda (x) (lambda (y) (+ x y))))) t-g-e)

(define eval-special-form (lambda (exp env) (cond ... ((lambda? exp) (eval-lambda exp env)) ((definition? exp) (if (not (eq? env t-g-e)) (error 'eval "non global definition: ~s" exp) (eval-definition exp))) ...)))

(define eval-definition (lambda (exp) (add-binding! (make-binding (definition-variable exp) (env-eval (definition-value exp) t-g-e))) 'ok))

Page 8: 1 Env. Model Implementation & Analyzer Practice Session #10 Env. Model Implementation & Analyzer Practice Session #10

8

Env. model evaluator: Evaluation example (1)

Evaluating a definition expression:

(define eval-special-form (lambda (exp env) (cond ... ((lambda? exp) (eval-lambda exp env)) ...)))

> (env-eval (derive '(define f (lambda (x) (lambda (y) (+ x y))))) t-g-e)

(define eval-lambda (lambda (exp env) (make-procedure (lambda-parameters exp) (lambda-body exp) env)))

(define make-procedure (lambda (parameters body env) (attach-tag (list parameters body env) 'procedure)))

(attach-tag (list '(x) '(lambda (y) (+ x y)) t-g-e)) 'procedure)

Page 9: 1 Env. Model Implementation & Analyzer Practice Session #10 Env. Model Implementation & Analyzer Practice Session #10

9

Env. model evaluator: Evaluation example (1)

Evaluating a definition expression:

(define env-eval (lambda (exp env) (cond ((atomic? exp) (eval-atomic exp env)) ((special-form? exp) (eval-special-form exp env)) ...)))

> (env-eval (derive '(define f (lambda (x) (lambda (y) (+ x y))))) t-g-e)

(define eval-special-form (lambda (exp env) (cond ... ((definition? exp) (if (not (eq? env t-g-e)) (error 'eval "non global definition: ~s" exp) (eval-definition exp))) ...)))

(define eval-definition (lambda (exp) (add-binding! (make-binding (definition-variable exp) (env-eval (definition-value exp) t-g-e))) 'ok))

Done!

(add-binding! (make-binding f (list 'procedure '(x) '(lambda (y) (+ x y)) t-g-e)))

Page 10: 1 Env. Model Implementation & Analyzer Practice Session #10 Env. Model Implementation & Analyzer Practice Session #10

10

Env. model evaluator: Evaluation example (2)

Evaluating a user procedure:

(define env-eval (lambda (exp env) (cond ((atomic? exp) (eval-atomic exp env)) ((special-form? exp) (eval-special-form exp env)) ...)))

> (derive-eval 'f)

(define eval-atomic (lambda (exp env) (if (or (number? exp) (boolean? exp) (null? exp)) exp (lookup-variable-value exp env))))

> '(procedure (x) ((lambda (y) (+ x y))) t-g-e)

• The result is our representation of a procedure.

Page 11: 1 Env. Model Implementation & Analyzer Practice Session #10 Env. Model Implementation & Analyzer Practice Session #10

Create a new frame where x maps to 1

GE

x: 1

11

Extend the environment

Evaluate the body

Env. model evaluator: Evaluation example (3)

Evaluating an application of a user procedure:> (env-eval '(define g (f 1) ))

(apply-procedure (‘procedure (x) ((lambda (y) (+ x y))) t-g-e) (1))

(make-frame ‘(x) ‘(1))

(extend-env new-frame t-g-e)

(eval-sequence body new-env)

Page 12: 1 Env. Model Implementation & Analyzer Practice Session #10 Env. Model Implementation & Analyzer Practice Session #10

12

• Can be regarded as a nested let expression.

• Similar to let, but defined variable can be used in the following definitions.

> (let ((a 1) (c (* a 2))) (+ a c))

> (define a 10)

Env. model evaluator: Supporting let*

Reminder: What is a let* expression?

Example:

> (let* ((a 1) (c (* a 2)))(+ a c))

> (let ((a 1)) (let ((c (* a 2))) (+ a c)))

> ((λ (a) ((λ (c) (+ a c)) (* a 2)) 1)

> 3

= =

> 21

Page 13: 1 Env. Model Implementation & Analyzer Practice Session #10 Env. Model Implementation & Analyzer Practice Session #10

13

An expression (let* ((v1 e1) (v2 e2) … (vn en)) b1 b2 … bm),

with respect to environment E0, is defined as follows:

E1 E0 * make-frame [(v1),(env-eval e1 E0)]E2 E1 * make-frame [(v2),(env-eval e2 E1)]...En En-1* make-frame [(vn),(env-eval en En-1)]

(env-eval b1 En) ... (env-eval bm-1 En)

Return (env-eval bm En)

Q: How would the evaluation rule for let look like?

Evaluation rule for a let* expression:

Env. model evaluator: Supporting let*

Page 14: 1 Env. Model Implementation & Analyzer Practice Session #10 Env. Model Implementation & Analyzer Practice Session #10

14

(define (let*? exp) (tagged-list? exp 'let*))

(define let*-bindings cadr)

(define let*-body cddr)

(define (let*-variables exp) (map car (let*-bindings exp)))

(define (let*-initial-values exp) (map cadr (let*-bindings exp)))

(define (let*-first-variable exp) (caar (let*-bindings exp)))

(define (let*-first-initial-value exp) (cadar (let*-bindings exp)))

(define (make-let*-bindings vars vals) (map list vars vals))

(define (make-let* bindings body) (append (list 'let* bindings) body))

Env. model evaluator: Supporting let* - as a derived expression

1. Add the required ADT procedures to the ASP

(let* ((v1 e1) (v2 e2) … (vn en)) b1 b2 … bm)

ASPDerived

expressions

CoreData structures

Page 15: 1 Env. Model Implementation & Analyzer Practice Session #10 Env. Model Implementation & Analyzer Practice Session #10

15

Env. model evaluator: Supporting let* - as a derived expression

2. Modify the procedure derived?(define (derived? exp) (or (cond? exp) (function-definition? exp) (let? exp) (let*? exp)))

(define (shallow-derive exp) (cond ((cond? exp) (cond->if exp)) ... ((let*? exp) (let*->nested-let exp)) (else "Unhandled derivision" exp)))

3. Modify the procedure shallow-derive

(let* ((v1 e1) (v2 e2) … (vn en)) b1 b2 … bm)

ASPDerived

expressions

CoreData structures

Page 16: 1 Env. Model Implementation & Analyzer Practice Session #10 Env. Model Implementation & Analyzer Practice Session #10

16

Env. model evaluator: Supporting let* - as a derived expression

4. Add a translation procedure let*->nested-let(define (let*->nested-let exp) (let ((bindings (let*-bindings exp)) (body (let*-body exp))) (if (null? bindings) (make-let '() body) (if (null? (cdr bindings)) (make-let bindings body) ;do-if-true (make-let ;do-if-false (make-let-bindings (list (let*-first-variable exp)) (list (let*-first-initial-value exp))) (list (make-let* (cdr bindings) body)) )))))

(let* ((v1 e1) (v2 e2) … (vn en)) b1 b2 … bm)

ASPDerived

expressions

CoreData structures

No changes to the core!

Page 17: 1 Env. Model Implementation & Analyzer Practice Session #10 Env. Model Implementation & Analyzer Practice Session #10

17

Env. model evaluator: Supporting let* - as a derived expression

4. Add a translation procedure let*->nested-let(define (let*->nested-let exp) (let ((bindings (let*-bindings exp)) (body (let*-body exp))) (if (null? bindings) (make-let '() body) (if (null? (cdr bindings)) (make-let bindings body) ;dit (make-let ;dif (make-let-bindings (list (let*-first-variable exp)) (list (let*-first-initial-value exp))) (list (make-let* (cdr bindings) body)) )))))

Q: The result is a let exp. Shouldn’t it be further derived?

Q: What about the let* expression created by make-let*?

Q: When the if-condition does not hold, we wrap the body parameter in a list. Why?

(let*->nested-let

(derive

Page 18: 1 Env. Model Implementation & Analyzer Practice Session #10 Env. Model Implementation & Analyzer Practice Session #10

19

Env. model evaluator: Supporting let* - as a special form

1. Add the required ADT procedures to the ASP

(let* ((v1 e1) (v2 e2) … (vn en)) b1 b2 … bm)

ASPDerived

expressions

CoreData structures

DONE

Page 19: 1 Env. Model Implementation & Analyzer Practice Session #10 Env. Model Implementation & Analyzer Practice Session #10

20

(define (special-form? exp) (or (quoted? exp) (lambda? exp) (definition? exp) (if? exp) (begin? exp) (let*? exp)))

(define (eval-special-form exp env) (cond ((quoted? exp) (text-of-quotation exp)) ((lambda? exp) (eval-lambda exp env)) … ((let*? exp) (eval-let* exp env))))

(let* ((v1 e1) (v2 e2) … (vn en)) b1 b2 … bm)

ASPDerived

expressions

CoreData structures

Env. model evaluator: Supporting let* - as a special form

2. Modify the procedure special-form?

3. Modify eval-special-form

Page 20: 1 Env. Model Implementation & Analyzer Practice Session #10 Env. Model Implementation & Analyzer Practice Session #10

21

(define (eval-let* exp env) (let ((vars (let*-variables exp)) (vals (let*-initial-values exp)) (body (let*-body exp))) (letrec ((helper

(lambda (vars-lst vals-lst env) (if (null? vars-lst) (eval-sequence body env) (helper (cdr vars-lst) (cdr vals-lst) (extend-env

(make-frame (list (car vars-lst)) (list (env-eval (car vals-lst) env)))

env)))))) (helper vars vals env))))

Env. model evaluator: Supporting let* - as a special form

4. Add the procedure eval-let*

Extend the Env with new frames for each variable.

When no variables remain, evaluate the body.

Page 21: 1 Env. Model Implementation & Analyzer Practice Session #10 Env. Model Implementation & Analyzer Practice Session #10

22

Env. model Compiler: Motivation

(define length (lambda (lst) (if (null? lst) 0 (+ 1 (length (cdr lst))))))

Special form?

Each time length is called, the interpreter:

• Uses the ASP to identify the body as an if exp.

• Extracts the required components for evaluation.

To avoid repeated analysis, the compiler:

• Analyzes a given expression in static (compilation) time.

• Returns a procedure that awaits an environment argument.

• Once applied, it evaluates the analyzed expression with respect to the given environment.

Page 22: 1 Env. Model Implementation & Analyzer Practice Session #10 Env. Model Implementation & Analyzer Practice Session #10

23

• Using the compiler, we distinguish analysis from evaluation.

• The compiler produces a procedure ready for execution, given an environment.

• The procedure returns the evaluation of the analyzed code with respect to the env.

• No analysis is performed during evaluation.

(define env-eval (lambda (exp env) <body>))

(define analyze (lambda (exp) (lambda (env) <analyzed -body>)))

Env. model Compiler: Introduction

env-eval:

[Exp*Env->Scheme-

Type]

compiler:

[Exp->[Env->Scheme-

Type]]

Interpreter vs Compiler:

Page 23: 1 Env. Model Implementation & Analyzer Practice Session #10 Env. Model Implementation & Analyzer Practice Session #10

(define (analyze exp) (cond ((atomic? exp) (analyze-atomic exp)) ((special-form? exp) (analyze-special-form exp)) ((application? exp) (analyze-application exp)) (else

(error "Unknown expression type -- EVAL“ exp))))

Env. model Compiler: Comparing with env-eval

The analyze procedure:

Handling an if expression:

(define (eval-if exp env) (if (true? (env-eval (if-predicate exp) env)) (env-eval (if-consequent exp) env) (env-eval (if-alternative exp) env)))

(define (analyze-if exp) (let ((pred (analyze (if-predicate exp))) (consequent (analyze (if-consequent exp))) (alternative (analyze (if-alternative exp)))) (lambda (env)

(if (true? (pred env)) (consequent env) (alternative env)))))

Evaluator

Analyzer

Page 24: 1 Env. Model Implementation & Analyzer Practice Session #10 Env. Model Implementation & Analyzer Practice Session #10

25

(define (analyze-special-form exp) (cond ((quoted? exp) (analyze-quoted exp)) ((lambda? exp) (analyze-lambda exp)) … ((let*? exp) (analyze-let* exp))))

As a derived expression? Same as already done with the evaluator!

1. Add the required ADT procedures to the ASP

2. identify a let* expression as a special form

3. Modify the procedure analyze-special-form:

Env. model Compiler: Supporting let*

As a special form?

Page 25: 1 Env. Model Implementation & Analyzer Practice Session #10 Env. Model Implementation & Analyzer Practice Session #10

26

(define (eval-let* exp env) (let ((vars (let*-variables exp)) (vals (let*-initial-values exp)) (body (let*-body exp))) (letrec ((helper

(lambda (vars-lst vals-lst env) (if (null? vars-lst) (eval-sequence body env) (helper (cdr vars-lst) (cdr vals-lst) (extend-env

(make-frame (list (car vars-lst)) (list (env-eval (car vals-lst) env)))

env)))))) (helper vars vals env))))

Env. model evaluator: Supporting let* - as a special form

4. Add the procedure eval-let*

Page 26: 1 Env. Model Implementation & Analyzer Practice Session #10 Env. Model Implementation & Analyzer Practice Session #10

27

4. Add the procedure analyze-let*:

We “translate” the evaluator procedure, eval-let*, to an analyzer procedure:

• Inductively apply analyze to all sub expressions.

• Curry the env parameter.

Env. model Compiler: Supporting let*

(define (analyze-let* exp) (let ((vars (let*-variables exp)) (vals (map analyze (let*-initial-values exp))) (body (analyze-sequence (let*-body exp)))) (letrec ((helper (lambda (vars-lst vals-lst env) (if (null? vars-lst) (body env) (helper (cdr vars-lst) (cdr vals-lst) (extend-env (make-frame (list (car vars-lst)) (list ((car vals-lst) env))) env)))))) (lambda (env) ;letrc body – Currying (helper vars vals env)))))