Top Banner
6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 • Eval review • Evaluation examples define lambda apply • New language elements
55

6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

Dec 21, 2015

Download

Documents

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 1

6.001 SICP – Evaluation I Recitation11/19/2004

• Eval review• Evaluation examples

define

lambda

apply• New language elements

Page 2: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 2

Stages of an interpreter

"(average 4 (+ 5 5))"

( average 4 (

+ 5 5 ) )

4symbolaverage

5symbol + 5

7

Lexical analyzer

Parser

Evaluator

Environment

Printer

"7"

input to each stage

Page 3: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 3

Arithmetic calculator

(define (tag-check e sym) (and (pair? e) (eq? (car e) sym)))

(define (sum? e) (tag-check e 'plus*))

 

(define (eval exp)

(cond

((number? exp) exp)

((sum? exp) (eval-sum exp))

(else

(error "unknown expression " exp))))

 

(define (eval-sum exp)

(+ (eval (cadr exp)) (eval (caddr exp))))

  

(eval '(plus* 24 (plus* 5 6)))

Page 4: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 4

Arithmetic calculator

Want to evaluate arithmetic expressions of two arguments, like:

(plus* 24 (plus* 5 6))

Page 5: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 5

We are just walking through a tree …

24plus*

65plus*

(eval )

24plus*

65plus*

sum? checks the tag

Page 6: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 6

We are just walking through a tree …

(eval-sum )

24plus*

65plus*

65plus*

(+ (eval 24) (eval ))

(+ (eval 5) (eval 6))

Page 7: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 7

The Evaluators

1. arithmetic calculator

2. add names: quote, define, environment is a table

3. add conditionals: eval-greater, eval-if, first apply

4. operators in environment: make-primitive, scheme-apply

5. environment as parameter to eval eval-special and lookup

6. compound procedures• lambda evaluates to double bubble (list of params,

body, encl.env.) • apply on double bubble drops frame from encl.env.,

binds names to values, evals body in new env.• environment is now a list of tables

Page 8: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 8

Eval 6 review - eval

(define (eval exp env) (cond ((number? exp) exp) ((symbol? exp) (lookup exp env)) ((define? exp) (eval-define exp env)) ((if? exp) (eval-if exp env)) ((lambda? exp) (eval-lambda exp env)) ((application? exp) (apply

(eval (car exp) env) (map (lambda (e) (eval e env)) (cdr exp)))) (else (error "unknown expression " exp))))

(define (define? exp) (tag-check exp ’define*))(define (if? exp) (tag-check exp ’if*))(define (application? e) (pair? e))(define (lambda? e) (tag-check e 'lambda*))

Page 9: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 9

Eval 6 review - env

(define (extend-env-with-new-frame names values env) (let ((new-frame (make-table))) (make-bindings! names values new-frame) (cons new-frame env))) (define (make-bindings! names values table) (for-each (lambda (name value) (table-put! table name value)) names values)) ; the initial global environment(define GE (extend-env-with-new-frame (list 'plus* 'greater*) (list (make-primitive +) (make-primitive >)) nil))

Page 10: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 10

Eval 6 review - lookup / define

; lookup searches the list of frames for the first match(define (lookup name env) (if (null? env) (error "unbound variable: " name) (let ((binding (table-get (car env) name))) (if (null? binding) (lookup name (cdr env)) (binding-value binding))))) ; define changes the first frame in the environment(define (eval-define exp env) (let ((name (cadr exp)) (defined-to-be (caddr exp))) (table-put! (car env) name (eval defined-to-be env)) 'undefined))  

Page 11: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 11

Eval 6 review - if

(define (eval-if exp env) (let ((predicate (cadr exp)) (consequent (caddr exp)) (alternative (cadddr exp))) (let ((test (eval predicate env))) (cond ((eq? test #t) (eval consequent env)) ((eq? test #f) (eval alternative env)) (else (error "val not boolean: " predicate))))))

Page 12: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 12

Eval 6 review - lambda

(define (eval-lambda exp env) (let ((args (cadr exp)) (body (caddr exp))) (make-compound args body env))) ;; ADT that implements the “double bubble” (define compound-tag 'compound)(define (make-compound parameters body env) (list compound-tag parameters body env))(define (compound? exp) (tag-check exp compound-tag)) (define (parameters compound) (cadr compound))(define (body compound) (caddr compound))(define (env compound) (cadddr compound))

Page 13: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 13

Eval 6 review - apply

(define scheme-apply apply)(define (apply operator operands) (cond ((primitive? operator) (scheme-apply (get-scheme-procedure operator)

operands)) ((compound? operator) (eval (body operator) (extend-env-with-new-frame (parameters operator) operands (env operator)))) (else (error "operator not a procedure: "

operator)))) 

Page 14: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 14

Eval examples

; assume (table-put! (car GE) ‘times* (make-primitive *))

(eval '(define* z* (plus* 1 3)) GE)

(eval '(define* mpy* (lambda* (x* y*) (times* x* y*))) GE)

(eval '(mpy* 3 z*) GE)

Page 15: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 15

evaluation example

(eval '(define* z* (plus* 1 3)) GE)

(define* z* (plus* 1 3)) | GE

Page 16: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 16

 (define (eval exp env) (cond ((number? exp) exp) ((symbol? exp) (lookup exp env)) ((define? exp) (eval-define exp env)) ((if? exp) (eval-if exp env)) ((lambda? exp) (eval-lambda exp env)) ((application? exp) (apply (eval (car exp) env) (map (lambda (e) (eval e env)) (cdr exp)))) (else (error "unknown expression " exp))))

(define (eval-define exp env) (let ((name (cadr exp)) (defined-to-be (caddr exp))) (table-put! (car env) name (eval defined-to-be env)) 'undefined))

Page 17: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 17

evaluation example

(eval '(define* z* (plus* 1 3)) GE)

(define* z* (plus* 1 3)) | GE

(plus* 1 3) | GE

Page 18: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 18

 (define (eval exp env) (cond ((number? exp) exp) ((symbol? exp) (lookup exp env)) ((define? exp) (eval-define exp env)) ((if? exp) (eval-if exp env)) ((lambda? exp) (eval-lambda exp env)) ((application? exp) (apply (eval (car exp) env) (map (lambda (e) (eval e env)) (cdr exp)) )) (else (error "unknown expression " exp))))

Page 19: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 19

evaluation example

(eval '(define* z* (plus* 1 3)) GE)

(define* z* (plus* 1 3)) | GE

(plus* 1 3) | GE

1 | GE

3 | GE

Page 20: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 20

 (define (eval exp env) (cond ((number? exp) exp) ((symbol? exp) (lookup exp env)) ((define? exp) (eval-define exp env)) ((if? exp) (eval-if exp env)) ((lambda? exp) (eval-lambda exp env)) ((application? exp) (apply

(eval (car exp) env) (map (lambda (e) (eval e env)) (cdr exp)))) (else (error "unknown expression " exp))))

Page 21: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 21

evaluation example

(eval '(define* z* (plus* 1 3)) GE)

(define* z* (plus* 1 3)) | GE

(plus* 1 3) | GE

1 | GE ==> 1

3 | GE ==> 3

Page 22: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 22

 (define (eval exp env) (cond ((number? exp) exp) ((symbol? exp) (lookup exp env)) ((define? exp) (eval-define exp env)) ((if? exp) (eval-if exp env)) ((lambda? exp) (eval-lambda exp env)) ((application? exp) (apply (eval (car exp) env) (map (lambda (e) (eval e env)) (cdr exp)) )) (else (error "unknown expression " exp))))

Page 23: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 23

 (define (eval exp env) (cond ((number? exp) exp) ((symbol? exp) (lookup exp env)) ((define? exp) (eval-define exp env)) ((if? exp) (eval-if exp env)) ((lambda? exp) (eval-lambda exp env)) ((application? exp) (apply (eval (car exp) env) (map (lambda (e) (eval e env)) (cdr exp)) )) (else (error "unknown expression " exp))))

Page 24: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 24

evaluation example

(eval '(define* z* (plus* 1 3)) GE)

(define* z* (plus* 1 3)) | GE

(plus* 1 3) | GE

1 | GE ==> 1

3 | GE ==> 3

plus* | GE

Page 25: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 25

 (define (eval exp env) (cond ((number? exp) exp) ((symbol? exp) (lookup exp env)) ((define? exp) (eval-define exp env)) ((if? exp) (eval-if exp env)) ((lambda? exp) (eval-lambda exp env)) ((application? exp) (apply (eval (car exp) env) (map (lambda (e) (eval e env)) (cdr exp)))) (else (error "unknown expression " exp))))

Page 26: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 26

evaluation example

(eval '(define* z* (plus* 1 3)) GE)

(define* z* (plus* 1 3)) | GE

(plus* 1 3) | GE

1 | GE ==> 1

3 | GE ==> 3

plus* | GE ==> (primitive [prim +])

Page 27: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 27

 (define (eval exp env) (cond ((number? exp) exp) ((symbol? exp) (lookup exp env)) ((define? exp) (eval-define exp env)) ((if? exp) (eval-if exp env)) ((lambda? exp) (eval-lambda exp env)) ((application? exp) (apply (eval (car exp) env) (map (lambda (e) (eval e env)) (cdr exp)) )) (else (error "unknown expression " exp))))

Page 28: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 28

(define scheme-apply apply)

(define (apply operator operands) (cond ((primitive? operator) (scheme-apply (get-scheme-procedure operator) operands)) ((compound? operator) (eval (body operator) (extend-env-with-new-frame (parameters operator) operands (env operator)))) (else (error "operator not a procedure: " operator))))

Page 29: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 29

evaluation example

(eval '(define* z* (plus* 1 3)) GE)

(define* z* (plus* 1 3)) | GE

(plus* 1 3) | GE

1 | GE ==> 1

3 | GE ==> 3

plus* | GE ==> (primitive [prim +])

(scheme-apply [prim +] 1 3) ==> 4

Page 30: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 30

 (define (eval exp env) (cond ((number? exp) exp) ((symbol? exp) (lookup exp env)) ((define? exp) (eval-define exp env)) ((if? exp) (eval-if exp env)) ((lambda? exp) (eval-lambda exp env)) ((application? exp) (apply (eval (car exp) env) (map (lambda (e) (eval e env)) (cdr exp)))) (else (error "unknown expression " exp))))

(define (eval-define exp env) (let ((name (cadr exp)) (defined-to-be (caddr exp))) (table-put! (car env) name (eval defined-to-be env)) 'undefined))

Page 31: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 31

evaluation example

(eval '(define* z* (plus* 1 3)) GE)

(define z* (plus* 1 3)) | GE

(plus* 1 3) | GE

1 | GE ==> 1

3 | GE ==> 3

plus* | GE ==> (primitive [prim +])

(scheme-apply [prim +] 1 3) ==> 4

(table-put! (car GE) ‘z* 4)

;modified environment!

Page 32: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 32

evaluation example

;assume (table-put! (car GE) ‘times* (make-primitive *))

(eval '(define* z* (plus* 1 3)) GE)

(eval '(define* mpy* (lambda* (x* y*) (times* x* y*))) GE)

(eval '(mpy* 3 z*) GE)

Page 33: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 33

evaluation example

(eval '(define* mpy* (lambda* (x* y*) (times* x* y*))) GE)

(define* mpy* (lambda* (x* y*) (times* x* y*))) | GE

Page 34: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 34

evaluation example

(eval '(define* mpy* (lambda* (x* y*) (times* x* y*))) GE)

(define* mpy* (lambda* (x* y*) (times* x* y*))) | GE

(lambda* (x* y*) (times* x* y*)) | GE

Page 35: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 35

 (define (eval exp env) (cond ((number? exp) exp) ((symbol? exp) (lookup exp env)) ((define? exp) (eval-define exp env)) ((if? exp) (eval-if exp env)) ((lambda? exp) (eval-lambda exp env)) ((application? exp) (apply (eval (car exp) env) (map (lambda (e) (eval e env)) (cdr exp)) )) (else (error "unknown expression " exp))))

(define (eval-lambda exp env) (let ((args (cadr exp)) (body (caddr exp))) (make-compound args body env)))

(define compound-tag 'compound)(define (make-compound parameters body env) (list compound-tag parameters body env))

Page 36: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 36

evaluation example

(eval* '(define* mpy* (lambda* (x* y*) (times* x* y*))) GE)

(define* mpy* (lambda* (x* y*) (times* x* y*))) | GE

(lambda* (x* y*) (times* x* y*)) | GE

(make-compound ‘(x* y*) ‘(times* x* y*) GE)

Page 37: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 37

evaluation example

(eval '(define* mpy* (lambda* (x* y*) (times* x* y*))) GE)

(define* mpy* (lambda* (x* y*) (times* x* y*))) | GE

(lambda* (x* y*) (times* x* y*)) | GE

(make-compound ‘(x* y*) ‘(times* x* y*) GE)

==> (list ‘compound ‘(x* y*) ‘(times* x* y*) GE)

Page 38: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 38

evaluation example

(eval '(define* mpy* (lambda* (x* y*) (times* x* y*))) GE)

(define* mpy* (lambda* (x* y*) (times* x* y*))) | GE

(lambda* (x* y*) (times* x* y*)) | GE

(make-compound ‘(x* y*) ‘(times* x* y*) GE)

==> (list ‘compound ‘(x* y*) ‘(times* x* y*) GE)

(table-put! (car GE) ‘mpy* (list ‘compound ‘(x* y*) ‘(times* x* y*) GE))

;modified environment!

Page 39: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 39

evaluation example

;assume (table-put! (car GE) ‘times* (make-primitive *))

(eval '(define* z* (plus* 1 3)) GE)

(eval '(define* mpy* (lambda* (x* y*) (times* x* y*))) GE)

(eval '(mpy* 3 z*) GE)

Page 40: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 40

evaluation example

(eval '(mpy* 3 z*) GE)

(mpy* 3 z*) | GE

Page 41: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 41

 (define (eval exp env) (cond ((number? exp) exp) ((symbol? exp) (lookup exp env)) ((define? exp) (eval-define exp env)) ((if? exp) (eval-if exp env)) ((lambda? exp) (eval-lambda exp env)) ((application? exp) (apply (eval (car exp) env) (map (lambda (e) (eval e env)) (cdr exp)) )) (else (error "unknown expression " exp))))

Page 42: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 42

evaluation example

(eval '(mpy* 3 z*) GE)

(mpy* 3 z*)| GE

mpy* | GE ==> ‘(compound …)

3 | GE ==> 3

z* | GE ==> 4(apply (list ‘compound ‘(x* y*) ‘(times* x* y*) GE)

‘( 3 4))

Page 43: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 43

(define scheme-apply apply)

(define (apply operator operands) (cond ((primitive? operator) (scheme-apply (get-scheme-procedure operator) operands)) ((compound? operator) (eval (body operator) (extend-env-with-new-frame (parameters operator) operands (env operator)))) (else (error "operator not a procedure: " operator))))

Page 44: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 44

evaluation example

(eval '(mpy* 3 z*) GE)

(mpy* 3 z*) | GEmpy* | GE ==> ‘(compound …)3 | GE ==> 3z* | GE ==> 4(apply (list ‘compound ‘(x* y*) ‘(times* x* y*) GE)

‘(3 4))(times* x* y*) | (extend-env-with-new-frame ‘(x* y*) ‘(3 4) GE))[ E1--> (x*:3, y*:4) --> GE ]

(times* x* y*) | E1 (scheme-apply [prim *] 3 4)==> 12!

Page 45: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 45

evaluation example

(eval '(define* class (quote* is-over)))

(define* class (quote* is-over)) | GE

(quote* is-over) | GE

Page 46: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 46

evaluation example

(eval '(define* class (quote* is-over)))

(define* class (quote* is-over)) | GE

(quote* is-over) | GE

unbound variable: quote*

Page 47: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 47

 (define (eval exp env) (cond ((number? exp) exp) ((quote? exp) (eval-quote exp)) ((symbol? exp) (lookup exp env)) ((define? exp) (eval-define exp env)) ((if? exp) (eval-if exp env)) ((lambda? exp) (eval-lambda exp env)) ((application? exp) (apply (eval (car exp) env) (map (lambda (e) (eval e env)) (cdr exp)) )) (else (error "unknown expression " exp))))

(define quote? (tag-check exp ‘quote*))

(define (eval-quote exp) (cadr exp))

Page 48: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 48

evaluation example

(eval '(define class (quote* is-over)))

(define class (quote* is-over)) | GE

(quote* is-over) | GE ==> is-over

(table-put! (car GE) ‘class ‘is-over)

Page 49: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 49

Summary

• Eval / Apply cycle is core of eval.• eval calls apply with operator and args• apply calls eval with expression and env

• no pending operations on either call – if expression is iterative so is evaluation

Page 50: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 50

Exercise

Extend the define* evaluator so define* also returns a value.

e.g. (define* a 16) ==> 16

Page 51: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 51

Eval 6 review - lookup / define

; lookup searches the list of frames for the first match(define (lookup name env) (if (null? env) (error "unbound variable: " name) (let ((binding (table-get (car env) name))) (if (null? binding) (lookup name (cdr env)) (binding-value binding))))) ; define changes the first frame in the environment(define (eval-define exp env) (let ((name (cadr exp)) (defined-to-be (caddr exp))) (table-put! (car env) name (eval defined-to-be env)) 'undefined))  

Page 52: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 52

Exercise

Extend our language with the and operator.

(and <exp1> <exp2> .. <expn>)

Page 53: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 53

Exercise -- add AND(define (tag-check e sym) (and (pair? e) (eq? (car e) sym)))(define (and? e) (tag-check e 'and*))

(define (eval exp) (cond ((number? exp) exp) ((boolean? exp) exp) ((and? exp) (eval-and exp)) (else (error "unknown expression " exp))))

(define (eval-and exp) (define (try-next terms) (if (null? terms)

#t(let ((first-term (eval (car terms))))

(if first-term (try-next (cdr terms))

#f)))) (try-next (cdr exp)))

(eval '(and* #t #t))

Page 54: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 54

Exercise - 4

Modify the interpreter so we can write infix assignments instead.

(define MyVar 10) (myVar := 10)

Page 55: 6.001 SICP 1 6.001 SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.

6.001 SICP 55

Eval 6 review - lookup / define

; lookup searches the list of frames for the first match(define (lookup name env) (if (null? env) (error "unbound variable: " name) (let ((binding (table-get (car env) name))) (if (null? binding) (lookup name (cdr env)) (binding-value binding))))) ; define changes the first frame in the environment(define (eval-define exp env) (let ((name (cadr exp)) (defined-to-be (caddr exp))) (table-put! (car env) name (eval defined-to-be env)) 'undefined))