Presentation is loading. Please wait.

Presentation is loading. Please wait.

Extending our interpreted language with Scheme’s set!

Similar presentations


Presentation on theme: "Extending our interpreted language with Scheme’s set!"— Presentation transcript:

1 Extending our interpreted language with Scheme’s set!
Adding Mutation Extending our interpreted language with Scheme’s set!

2 (define (sum from to) (define total 0) (let loop () (set! total (+ total from)) (set! from (+ from 1)) (if (<= from to) (loop) total)))

3 (define (sum from to) (begin (define total 0) (let loop () (set! total (+ total from)) (set! from (+ from 1)) (if (<= from to) (loop) total)))))

4 (let loop ([x ivx] [y ivy] …)
body) (letrec ([loop (lambda (x y …) body)]) (loop ivx ivy …))

5 (define (sum from to) (define total 0) (let loop () (set! total (+ total from)) (set! from (+ from 1)) (if (<= from to) (loop) total)))

6 (define (sum from to) (let loop ([i from] [total 0]) (if (<= i to) (loop (+ i 1) (+ total i)) total)))

7 (e0, env) ⇓ ((λ (x) e2), env’) (e1, env) ⇓ v1 (e2, env’[x ↦ v1]) ⇓ v2
((e0 e1), env) ⇓ v2 ((λ (x) e), env) ⇓ ((λ (x) e), env) (x, env) ⇓ env(x)

8 env maps variables to addresses
(x, env, st) env maps variables to addresses st maps addresses to values The current size of the store is the next address: | st |

9 (e2, env’[x ↦ |st2|], st2[|st2| ↦ v1]) ⇓ (v2, st3)
(e0, env, st0) ⇓ (((λ (x) e2), env’), st1) (e1, env, st1) ⇓ (v1, st2) ((e0 e1), env, st0) ⇓ (v2, st3) ((λ (x) e), env, st) ⇓ (((λ (x) e), env), st) (x, env, st) ⇓ (st(env(x)), st)

10 Store-passing style

11 (define (interp e env) (match e [(? symbol? x) (hash-ref env x)] [`(λ (,x) ,e0) `(clo (λ (,x) ,e0) ,env)] [`(,e0 ,e1) (define v0 (interp e0 env)) (define v1 (interp e1 env)) (match v0 [`(clo (λ (,x) ,e2) ,env) (interp e2 (hash-set env x v1))])]))

12 (define (interp e env st)
(match e [(? symbol? x) (hash-ref env x)] [`(λ (,x) ,e0) `(clo (λ (,x) ,e0) ,env)] [`(,e0 ,e1) (define v0 (interp e0 env)) (define v1 (interp e1 env)) (match v0 [`(clo (λ (,x) ,e2) ,env) (interp e2 (hash-set env x v1))])]))

13 (define (interp e env st)
(match e [(? symbol? x) (cons (hash-ref st (hash-ref env x)) st)] [`(λ (,x) ,e0) `(clo (λ (,x) ,e0) ,env)] [`(,e0 ,e1) (define v0 (interp e0 env)) (define v1 (interp e1 env)) (match v0 [`(clo (λ (,x) ,e2) ,env) (interp e2 (hash-set env x v1))])]))

14 (define (interp e env st)
(match e [(? symbol? x) (cons (hash-ref st (hash-ref env x)) st)] [`(λ (,x) ,e0) (cons `(clo (λ (,x) ,e0) ,env) st)] [`(,e0 ,e1) (define v0 (interp e0 env)) (define v1 (interp e1 env)) (match v0 [`(clo (λ (,x) ,e2) ,env) (interp e2 (hash-set env x v1))])]))

15 (e2, env’[x ↦ |st2|], st2[|st2| ↦ v1]) ⇓ (v2, st3)
(e0, env, st0) ⇓ (((λ (x) e2), env’), st1) (e1, env, st1) ⇓ (v1, st2) ((e0 e1), env, st0) ⇓ (v2, st3) ((λ (x) e), env, st) ⇓ (((λ (x) e), env), st) (x, env, st) ⇓ (st(env(x)), st)

16 (define (interp e env st)
(match e [(? symbol? x) (cons (hash-ref st (hash-ref env x)) st)] [`(λ (,x) ,e0) (cons `(clo (λ (,x) ,e0) ,env) st)] [`(,e0 ,e1) (match-define (cons v0 st1) (interp e0 env st)) (match-define (cons v1 st2) (interp e1 env st1)) (match v0 [`(clo (λ (,x) ,e2) ,env) (interp e2 (hash-set env x v1))])]))

17 (define (interp e env st)
(match e [(? symbol? x) (cons (hash-ref st (hash-ref env x)) st)] [`(λ (,x) ,e0) (cons `(clo (λ (,x) ,e0) ,env) st)] [`(,e0 ,e1) (match-define (cons v0 st1) (interp e0 env st)) (match-define (cons v1 st2) (interp e1 env st1)) (match v0 [`(clo (λ (,x) ,e2) ,env) (define addr (hash-count st2)) (interp e (hash-set env x addr) (hash-set st2 adds v1))])]))

18 Let’s code this up.


Download ppt "Extending our interpreted language with Scheme’s set!"

Similar presentations


Ads by Google