1 Lecture 18 Continue Evaluator. 2 z9 true#t + twice Representing procedures (eval '(define twice...

30
1 Lecture 18 Continue Evaluator
  • date post

    19-Dec-2015
  • Category

    Documents

  • view

    213
  • download

    0

Transcript of 1 Lecture 18 Continue Evaluator. 2 z9 true#t + twice Representing procedures (eval '(define twice...

1

Lecture 18

Continue Evaluator

2

z 9

true #t

+

twice

Representing procedures

(eval '(define twice (lambda (x) (+ x x))) GE)

symbolprimitive

schemeprocedure +

symbolprocedure

symbol+

symbolx

3

Representing the Environment

• (eval ‘(twice 4))• (extend-environment '(x) '(4) GE) GE x: 10

+: (primitive ...)twice: (procedure ..)

E1 x: 4

Abstractly

Concretely

GE

list ofvalues

list ofvariables

frame

x 4

E1

x

10

+ twice primitive

4

Representing the Environment

• (eval ‘(twice 5))• (extend-environment '(x) '(5) GE)

GE

list ofvalues

list ofvariables

frame

x 4

E1

x

10

+ twice primitive

x 5

E2

5

(define (lookup-variable-value var env) (define (env-loop env) (define (scan vars vals) (cond ((null? vars) (env-loop (enclosing-environment env))) ((eq? var (car vars)) (car vals)) (else (scan (cdr vars) (cdr vals))))) (if (eq? env the-empty-environment) (error "Unbound variable" var) (let ((frame (first-frame env))) (scan (frame-variables frame) (frame-values frame))))) (env-loop env))

(define (frame-variables frame) (car frame))(define (frame-values frame) (cdr frame))

(define (enclosing-environment env) (cdr env))(define (first-frame env) (car env))

6

(define (define-variable! var val env) (let ((frame (first-frame env))) (define (scan vars vals) (cond ((null? vars) (add-binding-to-frame! var val frame)) ((eq? var (car vars)) (set-car! vals val)) (else (scan (cdr vars) (cdr vals))))) (scan (frame-variables frame) (frame-values frame))))

(define (eval-definition exp env) (let ((name (cadr exp)) (defined-to-be (eval (caddr exp) env))) (define-variable! name defined-to-be env) ‘undefined))

Assignments

(define (eval-assignment exp env) (set-variable-value! (assignment-variable exp) (eval (assignment-value exp) env) env) 'ok)

(define (assignment? exp) (tagged-list? exp 'set!))

(define (assignment-variable exp) (cadr exp))

(define (assignment-value exp) (caddr exp))

set-variable-value!

(define (set-variable-value! var val env) (define (env-loop env) (define (scan vars vals) (cond ((null? vars) (env-loop (enclosing-environment env))) ((eq? var (car vars)) (set-car! vals val)) (else (scan (cdr vars) (cdr vals)))))

(if (eq? env the-empty-environment) (error "Unbound variable -- SET!" var) (let ((frame (first-frame env))) (scan (frame-variables frame) (frame-values frame))))( (env-loop env))

9

Initialization primitives andinitial env.

(define the-empty-environment '())

(define the-global-environment (setup-environment))

(define (setup-environment) (let ((initial-env (extend-environment (primitive-procedure-names) (primitive-procedure-objects) the-empty-environment))) (define-variable! 'true #t initial-env) (define-variable! 'false #f initial-env) initial-env))

10

(define primitive-procedure (list (list 'car car) (list 'cdr cdr) (list 'cons cons) (list 'null? null?) (list '+ +);; more primitives ))

(define (primitive-procedure-names) (map car primitive-procedures))

(define (primitive-procedure-objects) (map (lambda (proc) (list 'primitive (cadr proc))) primitive-procedures))

11

Read-Eval-Print Loop

(define input-prompt ";;; M-Eval input:")(define output-prompt ";;; M-Eval value:")

(define (prompt-for-input string) (newline) (newline) (display string) (newline))

(define (announce-output string) (newline) (display string) (newline))

(define (driver-loop) (prompt-for-input input-prompt) (let ((input (read))) (let ((output (eval input the-global-env))) (announce-output output-prompt) (user-print output))) (driver-loop))

Apply (reminder)

(define (apply procedure arguments) (cond ((primitive-procedure? procedure) (apply-primitive-procedure procedure arguments)) ((compound-procedure? procedure) (eval-sequence (procedure-body procedure) (extend-environment (procedure-parameters procedure) arguments (procedure-env procedure)))) (else (error "Unknown procedure type -- APPLY" procedure))))

15

Execution Examples

• An iterative algorithm in scheme

(eval '(define odd (lambda (n) (odd (- n 2)))) GE)

• A recursive algorithm in scheme

(eval '(define sum (lambda (n) (+ n (sum (- n 1))))) GE)

• Base case and if check omitted from both algorithmsto simplify the example

18

Summary

• Cycle between eval and apply is the core of the evaluator• eval calls apply with operator and argument values• apply calls eval with expression and environment

• What is still missing from scheme ?• Some special forms• data types other than numbers and booleans

21

Example – Changing Syntax

• Suppose you wanted a "verbose" application syntax:

(CALL <proc> ARGS <arg1> <arg2> ...)

• Changes – only in the syntax routines!

(define (application? exp) (tagged-list? 'CALL))

(define (operator app) (cadr app))

(define (operands app) (cdddr app))

22

Implementing "Syntactic Sugar"

• Idea:• Implement a simple fundamental "core" in the evaluator• Easy way to add alternative/convenient syntax?

• "let" as sugared procedure application:

(let ((<name1> <val1>) (<name2> <val2>)) <body>)

((lambda (<name1> <name2>) <body>) <val1> <val2>)

23

Detect and Transform the Alternative Syntax

(define (eval exp env) (cond ((self-evaluating? exp) exp) ((variable? exp) (lookup-variable-value exp env)) ((quoted? exp) (text-of-quotation exp)) . . . ((cond? exp) (eval (cond->if exp) env)) ((let? exp) (eval (let->combination exp) env)) ((application? exp) (apply (eval (operator exp) env)

(list-of-values (operands exp) env))) (else (error "Unknown expression" exp))))

24

Implementing cond: Syntax procedures

(define (cond-clauses exp) (cdr exp))

(define (cond-else-clause? clause) (eq? (cond-predicate clause) 'else))

(define (cond-predicate clause) (car clause))

(define (cond-actions clause) (cdr clause))

(cond ((= x 23) (+ x 1))

(else (- x 1)))

(if (= x 23) (+ x 1) (- x 1))

25

Cond syntax

(cond ((= x 23) (+ x 1))

(else (- x 1)))

cond

else

23x=

1x+

1x-

26

Transforming sequence of expression toan expression

(define (sequence->exp seq) (cond ((null? seq) seq) ((last-exp? seq) (first-exp seq)) (else (make-begin seq))))

(define (make-begin seq) (cons 'begin seq))

2x*

car y

begin

27

Implementing cond (Cont.)

(cond ((= x 23) (+ x 1))

(else (- x 1)))

(if (= x 23) (+ x 1) (- x 1))

28

Implementing cond

(define (cond->if exp) (expand-clauses (cond-clauses exp)))

(define (expand-clauses clauses) (if (null? clauses) 'false ; no else clause (let ((first (car clauses)) (rest (cdr clauses))) (if (cond-else-clause? first) (if (null? rest) (sequence->exp (cond-actions first)) (error "ELSE clause isn't last -- COND->IF" clauses)) (make-if (cond-predicate first) (sequence->exp (cond-actions first)) (expand-clauses rest))))))

29

Details of cond syntax transformation

(cond ((= x 23) (+ x 1))

(else (- x 1)))

cond

else

23x=

1x+

1x-

30

Details of cond syntax transformation

(expand-clauses

else

23x=

1x+

1x-

)

31

Details of cond syntax transformation

first

else

23x=

1x+

1x-

rest

32

Details of cond syntax transformation

23x=

1x+

else

1x-

(make-if

(expand-clauses ))

33

Details of cond syntax transformation

23x=

1x+

1x-

(make-if

)

34

Details of cond syntax transformation

23x=

1x+

1x-

if

35

Named Procedures

Support (define (foo <parm>) <body>)

(define (eval-definition exp env) (define-variable! (definition-variable exp) (eval (definition-value exp) env) env))

(define (definition-variable exp) (if (symbol? (cadr exp)) (cadr exp) (caadr exp)))

(define (definition-value exp) (if (symbol? (cadr exp)) (caddr exp) (make-lambda (cdadr exp) ;formal params

(cddr exp)))) ;body

Exam

• 4 Questions

• 3 Hours

• You may bring any written or printed material (no laptops..)

• You can use every function studied in class \ recitation \ exercise

• All covered material

• Good Luck and have a nice vacation!