cs 251 fall 2019 cs 251 fall 2019 principles of
play

CS 251 Fall 2019 CS 251 Fall 2019 Principles of Programming - PowerPoint PPT Presentation

CS 251 Fall 2019 CS 251 Fall 2019 Principles of Programming Languages Principles of Programming Languages Ben Wood Ben Wood Lexical Scope and Function Closures https://cs.wellesley.edu/~cs251/f19/ 1 Lexical Scope and Function


  1. λ λ CS 251 Fall 2019 CS 251 Fall 2019 Principles of Programming Languages Principles of Programming Languages Ben Wood Ben Wood Lexical Scope and Function Closures https://cs.wellesley.edu/~cs251/f19/ 1 Lexical Scope and Function Closures

  2. Topics • Lexical vs dynamic scope • Closures implement lexical scope. • Design considerations: why lexical scope? • Relevant design dimensions Lexical Scope and Function Closures 2

  3. A question of scope (warmup) (define x 1) (define f (lambda (y) (+ x y))) (define z (let ([x 2] [y 3]) (f (+ x y)) )) What is the argument value passed to this function application? Lexical Scope and Function Closures 3

  4. A question of scope (define x 1) (define f (lambda (y) (+ x y))) (define z (let ([x 2] [y 3]) (f (+ x y)) )) What is the value of x when this function body is evaluated for this function application? Lexical Scope and Function Closures 4

  5. A question of free variables free in an expression, e , if x is referenced in e A variable, x , is fr outside the scope of any binding of x within e . x is a free variable of the lambda expression. (define x 1) (define f (lambda (y) (+ x y))) (define z (let ([x 2] [y 3]) (f (+ x y)) )) To what bindings do free variables of a function refer when the function is applied? Lexical Scope and Function Closures 5

  6. Answer 1: lexical (static) scope free in an expression, e , if x is referenced in e A variable, x , is fr outside the scope of any binding of x within e . x is a free variable of the lambda expression. (define x 1) (define f (lambda (y) (+ x y))) (define z (let ([x 2] [y 3]) (f (+ x y)))) Free variables of a function refer to bindings in the environment where the function is de defined , regardless of where it is applied. Lexical Scope and Function Closures 6

  7. Answer 2: dynamic scope free in an expression, e , if x is referenced in e A variable, x , is fr outside the scope of any binding of x within e . x is a free variable of the lambda expression. (define x 1) (define f (lambda (y) (+ x y))) (define z (let ([ x 2] [y 3]) (f (+ x y)) )) Free variables of a function refer to bindings in the environment where the function is ap applied , regardless of where it is defined. Lexical Scope and Function Closures 7

  8. Answer 2: dynamic scope free in an expression, e , if x is referenced in e A variable, x , is fr outside the scope of any binding of x within e . x is a free variable of the lambda expression. (define x 1) (define f (lambda (y) (+ x y))) (define z (let ([x 2] [y 3]) (f (+ x y)))) Free variables of a function refer to bindings in the environment where the function is ap applied , regardless of where it is defined. Lexical Scope and Function Closures 8

  9. Closures implement lexical scope. Closures allow functions to use any binding in the environment where the function is defined, regardless of where it is applied. Lexical Scope and Function Closures 9

  10. Anonymous function definition expressions Week 1 Sy Syntax : ( lambda ( x1 … xn ) e ) – pa parameters: x1 through xn are identifiers – bo body: e is any expression Ev Evaluation : closure , ⟨ E, (lambda (x1 … xn) e) ⟩ , 1. The result is a fu function c holding the current environment, E , and the function. [closure] E ⊢ (lambda (x1 … xn) e) ↓ ⟨ E, (lambda (x1 … xn) e) ⟩ Note: – An anonymous function definition is an expression. – A function closure is a new kind of value. Closures are not expressions. – This is a de definition , not a call . . The body, e , is no not evaluated now. lambda from the λ -ca – calcu culus . Lexical Scope and Function Closures 10

  11. Function application (call) Week 1 Syntax : ( e0 e1 ... en ) Sy Ev Evalu luati tion : 1. Under the current dynamic environment, E , evaluate e0 through en to values v0, …, vn. 2. If v0 is a function closure of n arguments, ⟨ E', (lambda (x1 … xn) e) ⟩ then The result is the result of evaluating the closure body, e , under the closure environment, E' , extended with argument bindings: x1 ⟼ v1, …, xn ⟼ vn . Otherwise, there is a type error. Functions 11

  12. Function application (call) Week 1 Sy Synta ntax : ( e0 e1 … en ) Ev Evaluation : E ⊢ e0 ↓ ⟨ E', (lambda (x1 … xn) e) ⟩ E ⊢ e1 ↓ v1 … E ⊢ en ↓ vn x1 ⟼ v1, …, xn ⟼ vn, E' ⊢ e ↓ v [apply] E ⊢ (e0 e1 … en) ↓ v Functions 12

  13. Example: env pointer shows env structure, by pointing to “rest of environment” returning a function binding maps variable name to value def de (define x 1) def Current evaluation step: de (define (f y) (let ([x (+ y 1)]) Current environment: (lambda (z) (+ x y z)) ) (define z (let ([x 3] [g (f 4)] [y 5]) (g 6) )) Lexical Scope and Function Closures 13

  14. Example: env pointer shows env structure, by pointing to “rest of environment” returning a function binding maps variable name to value 1 (define x 1) x def de (define (f y) def de (let ([x (+ y 1)]) (lambda (z) (+ x y z)) ) (define z (let ([x 3] [g (f 4)] [y 5]) (g 6) )) Lexical Scope and Function Closures 14

  15. Example: env pointer shows env structure, by pointing to “rest of environment” returning a function binding maps variable name to value 1 (define x 1) x (define (f y) (lambda (y) f def env de (let ([x (+ y 1)]) (lambda (z) (let ([x (+ y 1)]) (+ x y z)) ) ) (lambda (z) (+ x y z)) ) (define z (let ([x 3] [g (f 4)] def de [y 5]) (g 6) )) Lexical Scope and Function Closures 15

  16. Example: env pointer shows env structure, by pointing to “rest of environment” returning a function binding maps variable name to value 1 (define x 1) x (define (f y) (lambda (y) f def env de (let ([x (+ y 1)]) (lambda (z) (let ([x (+ y 1)]) let (+ x y z)) ) ) le (lambda (z) (+ x y z)) ) (define z (let ([x 3] [g (f 4)] def let de le [y 5]) (g 6) )) Lexical Scope and Function Closures 16

  17. Example: env pointer shows env structure, by pointing to “rest of environment” returning a function binding maps variable name to value 1 (define x 1) x (define (f y) (lambda (y) f def env de (let ([x (+ y 1)]) (lambda (z) (let ([x (+ y 1)]) (+ x y z)) ) ) (lambda (z) (+ x y z)) ) 3 x let le (define z (let ([x 3] [g (f 4)] def de [y 5]) let le (g 6) )) Lexical Scope and Function Closures 17

  18. Example: env pointer shows env structure, by pointing to “rest of environment” returning a function binding maps variable name to value 1 (define x 1) x app app (define (f y) (lambda (y) app app f def env de (let ([x (+ y 1)]) (lambda (z) (let ([x (+ y 1)]) (+ x y z)) ) ) (lambda (z) app app 4 y (+ x y z)) ) 3 x let le (define z (let ([x 3] [g (f 4)] def de [y 5]) let le (g 6) )) Lexical Scope and Function Closures 18

  19. Example: env pointer shows env structure, by pointing to “rest of environment” returning a function binding maps variable name to value 1 (define x 1) x (define (f y) (lambda (y) f def env de (let ([x (+ y 1)]) (lambda (z) (let ([x (+ y 1)]) p p p p (+ x y z)) ) ) a a (lambda (z) p p 4 p p a a y (+ x y z)) ) 3 x let le (define z (let ([x 3] 5 x app app [g (f 4)] def de [y 5]) let le (g 6) )) Lexical Scope and Function Closures 19

  20. Example: env pointer shows env structure, by pointing to “rest of environment” returning a function binding maps variable name to value 1 (define x 1) x (define (f y) (lambda (y) f def env de (let ([x (+ y 1)]) (lambda (z) (let ([x (+ y 1)]) (+ x y z)) ) ) (lambda (z) app app 4 y (+ x y z)) ) 3 x let le app app (define z (let ([x 3] 5 x app app [g (f 4)] def de [y 5]) (lambda (z) let le env (+ x y z)) (g 6) )) Lexical Scope and Function Closures 20

  21. Example: env pointer shows env structure, by pointing to “rest of environment” returning a function binding maps variable name to value 1 (define x 1) x (define (f y) (lambda (y) f def env de (let ([x (+ y 1)]) (lambda (z) (let ([x (+ y 1)]) (+ x y z)) ) ) (lambda (z) 4 y (+ x y z)) ) 3 x (define z (let ([x 3] 5 x [g (f 4)] def g de let le [y 5]) (lambda (z) env (+ x y z)) let le (g 6) )) Lexical Scope and Function Closures 21

  22. Example: env pointer shows env structure, by pointing to “rest of environment” returning a function binding maps variable name to value 1 (define x 1) x (define (f y) (lambda (y) f def env de (let ([x (+ y 1)]) (lambda (z) (let ([x (+ y 1)]) (+ x y z)) ) ) (lambda (z) 4 y (+ x y z)) ) 3 x (define z (let ([x 3] 5 x [g (f 4)] def g de [y 5]) (lambda (z) env (+ x y z)) 5 (g 6) )) y let le let le Lexical Scope and Function Closures 22

  23. Example: env pointer shows env structure, by pointing to “rest of environment” returning a function binding maps variable name to value 1 (define x 1) x (define (f y) (lambda (y) f def env de (let ([x (+ y 1)]) (lambda (z) (let ([x (+ y 1)]) (+ x y z)) ) ) (lambda (z) 4 y (+ x y z)) ) p p p p a a 3 x (define z (let ([x 3] 5 x [g (f 4)] def g de [y 5]) (lambda (z) env (+ x y z)) p p p p a a 5 (g 6) )) y let le 6 z app app let le Lexical Scope and Function Closures 23

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend