Lecture 26 The Metacircular Evaluator Eval Apply CS

  • Slides: 30
Download presentation
Lecture 26: The Metacircular Evaluator Eval Apply CS 200: Computer Science David Evans University

Lecture 26: The Metacircular Evaluator Eval Apply CS 200: Computer Science David Evans University of Virginia 27 March 2002 CS 200 Spring 2002 http: //www. cs. virginia. edu/~evans Computer Science

Menu • Metacircular Evaluator Core Review • PS 6 – Adventure Game Nominations •

Menu • Metacircular Evaluator Core Review • PS 6 – Adventure Game Nominations • Implementing Environments 27 March 2002 CS 200 Spring 2002 2

Environmental Model of Evaluation 1. To evaluate a combination, evaluate all the subexpressions and

Environmental Model of Evaluation 1. To evaluate a combination, evaluate all the subexpressions and apply the value of the first subexpression to the values of the other subexpressions. 2. To apply a compound procedure to a set of arguments, evaluate the body of the procedure in a new environment. The parent of the new environment is the procedure’s environment; the frame is a new frame that contains places with the formal parameters bound to the arguments. 27 March 2002 CS 200 Spring 2002 3

meval (define (meval expr env) (cond ((self-evaluating? expr) ((variable? expr) (environment-lookup-name expr env)) ((lambda?

meval (define (meval expr env) (cond ((self-evaluating? expr) ((variable? expr) (environment-lookup-name expr env)) ((lambda? expr) (make-procedure (lambda-parameters expr) (lambda-body expr) env)) ((application? expr) (mapply (meval (application-operator expr) env) (map (lambda (subexpr) (meval subexpr env)) (application-operands expr)))) (else (error "Unknown expression: " exp)))) 27 March 2002 CS 200 Spring 2002 4

mapply (define (mapply procedure operands) (cond ((primitive-procedure? procedure) (apply-primitive procedure operands)) ((compound-procedure? procedure) (meval-sequence

mapply (define (mapply procedure operands) (cond ((primitive-procedure? procedure) (apply-primitive procedure operands)) ((compound-procedure? procedure) (meval-sequence (procedure-body procedure) (extend-environment (procedure-parameters procedure) operands (procedure-environment procedure)))) (else (error “Can’t apply: " procedure)))) 27 March 2002 CS 200 Spring 2002 5

PS 6 27 March 2002 CS 200 Spring 2002 6

PS 6 27 March 2002 CS 200 Spring 2002 6

Question 3 What is (make-object ‘book)? global environment (define make-object (lambda (name) (lambda (message)

Question 3 What is (make-object ‘book)? global environment (define make-object (lambda (name) (lambda (message) (if (eq? message ‘object? ) … ))))))) name : book parameters: message body: (if (eq? message …) 27 March 2002 CS 200 Spring 2002 7

What is ((make-object ‘book) ‘name)? global environment (define make-object (lambda (name) (lambda (message) (if

What is ((make-object ‘book) ‘name)? global environment (define make-object (lambda (name) (lambda (message) (if (eq? message ‘object? ) … (if (eq? message 'name) (lambda (self) name) ))))))) name : book message : name parameters: self body: name 27 March 2002 CS 200 Spring 2002 8

What is (((make-object ‘book) ‘name) 3)? global environment (define make-object (lambda (name) (lambda (message)

What is (((make-object ‘book) ‘name) 3)? global environment (define make-object (lambda (name) (lambda (message) (if (eq? message ‘object? ) … (if (eq? message 'name) (lambda (self) name) ))))))) name : book message : parameters: self body: name 27 March 2002 CS 200 Spring 2002 name self : 3 name 9

Adventure Game Nominees 27 March 2002 CS 200 Spring 2002 10

Adventure Game Nominees 27 March 2002 CS 200 Spring 2002 10

The Nominees Are… • “Governor” • “Honor System” • “Hungry” • “Making the Band”

The Nominees Are… • “Governor” • “Honor System” • “Hungry” • “Making the Band” 27 March 2002 CS 200 Spring 2002 11

Environments 27 March 2002 CS 200 Spring 2002 12

Environments 27 March 2002 CS 200 Spring 2002 12

From Lecture 19: global environment (define nest (lambda (x) (+ x x)))) > ((nest

From Lecture 19: global environment (define nest (lambda (x) (+ x x)))) > ((nest 3) 4) + : #<primitive: +> x: 3 x : 3 nest: parameters: x body: (lambda (x) (+ x x)) (nest 3) (x) (+ x x)) 4) ((lambda x : 4 27 March 2002 (+ x x) CS 200 Spring 2002 13

Representing Environments An environment is a frame and a parent. x : 4 (define

Representing Environments An environment is a frame and a parent. x : 4 (define (make-new-environment frame env) (cons frame env)) 27 March 2002 CS 200 Spring 2002 14

Environment Procedures (define (first-frame env) (car env)) (define (enclosing-environment env) (cdr env)) 27 March

Environment Procedures (define (first-frame env) (car env)) (define (enclosing-environment env) (cdr env)) 27 March 2002 CS 200 Spring 2002 15

Representing Frames A frame is a list of name-value pairs. y : 3 x

Representing Frames A frame is a list of name-value pairs. y : 3 x : 4 (define (make-empty-frame) (list)) 27 March 2002 CS 200 Spring 2002 16

Environmental Model of Evaluation 1. To evaluate a combination, evaluate all the subexpressions and

Environmental Model of Evaluation 1. To evaluate a combination, evaluate all the subexpressions and apply the value of the first subexpression to the values of the other subexpressions. 2. To apply a compound procedure to a set of arguments, evaluate the body of the procedure in a new environment. The parent of the new environment is the procedure’s environment; the frame is a new frame that contains places with the formal parameters bound to the arguments. 27 March 2002 CS 200 Spring 2002 17

mapply (define (mapply procedure operands) (cond ((primitive-procedure? procedure) (apply-primitive procedure operands)) ((compound-procedure? procedure) (meval-sequence

mapply (define (mapply procedure operands) (cond ((primitive-procedure? procedure) (apply-primitive procedure operands)) ((compound-procedure? procedure) (meval-sequence (procedure-body procedure) (extend-environment (procedure-parameters procedure) operands (procedure-environment procedure)))) (else (error “Can’t apply: " procedure)))) 27 March 2002 CS 200 Spring 2002 18

extend-environment (define (extend-environment names values env) (make-new-environment (map (lambda (name value) (cons name value))

extend-environment (define (extend-environment names values env) (make-new-environment (map (lambda (name value) (cons name value)) names values) env)) 27 March 2002 CS 200 Spring 2002 19

meval (define (meval expr env) (cond ((self-evaluating? expr) ((variable? expr) (environment-lookup-name expr env)) ((lambda?

meval (define (meval expr env) (cond ((self-evaluating? expr) ((variable? expr) (environment-lookup-name expr env)) ((lambda? expr) (make-procedure (lambda-parameters expr) (lambda-body expr) env)) ((application? expr) (mapply (meval (application-operator expr) env) (map (lambda (subexpr) (meval subexpr env)) (application-operands expr)))) (else (error "Unknown expression: " exp)))) 27 March 2002 CS 200 Spring 2002 20

environment-lookup-name (define (environment-lookup-name env) (if (null? env) (error "No binding " name) (if (frame-contains?

environment-lookup-name (define (environment-lookup-name env) (if (null? env) (error "No binding " name) (if (frame-contains? name (first-frame env)) (frame-lookup-name (first-frame env)) (environment-lookup-name (enclosing-environment env))))) 27 March 2002 CS 200 Spring 2002 21

frame procedures (define (frame-contains? name frame) (insertlg (lambda (var result) (if (eq? (car var)

frame procedures (define (frame-contains? name frame) (insertlg (lambda (var result) (if (eq? (car var) name) #t result)) frame #f)) (define (frame-lookup-name frame) (if (null? frame) (error "Name not found: " name) (if (eq? (car frame)) name) (cdr (car frame)) (frame-lookup-name (cdr frame))))) 27 March 2002 CS 200 Spring 2002 22

meval (define (meval expr env) (cond ((self-evaluating? expr) ((variable? expr) (environment-lookup-name expr env)) ((lambda?

meval (define (meval expr env) (cond ((self-evaluating? expr) ((variable? expr) (environment-lookup-name expr env)) ((lambda? expr) (make-procedure (lambda-parameters expr) (lambda-body expr) env)) ((application? expr) (mapply (meval (application-operator expr) env) (map (lambda (subexpr) (meval subexpr env)) (application-operands expr)))) (else (error "Unknown expression: " exp)))) 27 March 2002 CS 200 Spring 2002 23

mapply (define (mapply procedure operands) (cond ((primitive-procedure? procedure) (apply-primitive procedure operands)) ((compound-procedure? procedure) (meval-sequence

mapply (define (mapply procedure operands) (cond ((primitive-procedure? procedure) (apply-primitive procedure operands)) ((compound-procedure? procedure) (meval-sequence (procedure-body procedure) (extend-environment (procedure-parameters procedure) operands (procedure-environment procedure)))) (else (error “Can’t apply: " procedure)))) 27 March 2002 CS 200 Spring 2002 24

procedures (define (make-procedure parameters body environment) (list 'procedure parameters body environment)) (define (compound-procedure? expr)

procedures (define (make-procedure parameters body environment) (list 'procedure parameters body environment)) (define (compound-procedure? expr) (tagged-list? expr 'procedure)) (define (procedure-parameters procedure) (cadr procedure)) (define (procedure-body procedure) (caddr procedure)) (define (procedure-environment procedure) (cadddr procedure)) (define (tagged-list? expr tag) (if (pair? expr) (eq? (car expr) tag) #f)) 27 March 2002 CS 200 Spring 2002 25

meval (define (meval expr env) (cond ((self-evaluating? expr) ((variable? expr) (environment-lookup-name expr env)) ((lambda?

meval (define (meval expr env) (cond ((self-evaluating? expr) ((variable? expr) (environment-lookup-name expr env)) ((lambda? expr) (make-procedure (lambda-parameters expr) (lambda-body expr) env)) ((application? expr) (mapply (meval (application-operator expr) env) (map (lambda (subexpr) (meval subexpr env)) (application-operands expr)))) (else (error "Unknown expression: " exp)))) 27 March 2002 CS 200 Spring 2002 26

self-evaluating? (define (self-evaluating? expr) (or (number? expr) (string? expr) (primitive-procedure? expr))) 27 March 2002

self-evaluating? (define (self-evaluating? expr) (or (number? expr) (string? expr) (primitive-procedure? expr))) 27 March 2002 CS 200 Spring 2002 27

Primitive Procedures (define (primitive-procedure? expr) (tagged-list? expr 'primitive-procedure)) (define (make-primitive-procedure expr) (list 'primitive-procedure expr))

Primitive Procedures (define (primitive-procedure? expr) (tagged-list? expr 'primitive-procedure)) (define (make-primitive-procedure expr) (list 'primitive-procedure expr)) (define (primitive-procedure) (cadr procedure)) 27 March 2002 CS 200 Spring 2002 28

the-global-environment (define the-empty-environment '()) (define the-global-environment (make-new-environment (list (cons '+ (make-primitive-procedure +)) (cons '*

the-global-environment (define the-empty-environment '()) (define the-global-environment (make-new-environment (list (cons '+ (make-primitive-procedure +)) (cons '* (make-primitive-procedure *)) (cons '- (make-primitive-procedure -)) ) the-empty-environment)) 27 March 2002 CS 200 Spring 2002 29

Charge • This is powerful: once we have an metacircular evaluator, we can easily

Charge • This is powerful: once we have an metacircular evaluator, we can easily make changes to the language! • Friday: quantum computing, variations on Scheme • PS 7: extend our Mini-Scheme evaluator to model quantum computing (loosely) 27 March 2002 CS 200 Spring 2002 30