Tema 4 Entornos y procedimientos locales José Antonio Alonso María José Hidalgo Álvaro Romero Dpto. de Ciencias de la Computación e Inteligencia Articial Universidad de Sevilla Entornos locales Contenido: • Forma especial let. • Forma especial let∗. • Forma especial letrec. • Procedimientos y entornos locales. Informática CcIa Entornos y procedimientos locales 4.1 Entornos Concepto de entorno: • Variable libre. • Variable ligada. • Ámbito de una variable. Entornos globales: • Entorno global inicial (del sistema). • Entorno global del usuario. Entornos locales: • Variable ligada localmente. Informática CcIa Entornos y procedimientos locales 4.2 Forma especial let (let ((variable1 valor1) (variable2 valor2) .. (variableN valorN)) expresión1 expresión2 .. expresiónM) Informática CcIa Entornos y procedimientos locales 4.3 Forma especial let: ejemplos (dene a 10) (dene x 0) (let ((x 3) (y 2)) (∗ (+ x y ) a)) => 50 (let ((x 3)) (let ((y 2) (a (sqrt 4))) (∗ (+ x y ) a))) => 10 Informática (let ((x 3) (y 2)) (∗ (+ x y ) b)) => reference to undened identier: b (let ((x 3)) (let ((y 2) (a (sqrt 4))) (∗ (+ x y ) b))) => reference to undened identier: b CcIa Entornos y procedimientos locales 4.4 Forma especial let: raices (raices 1 −5 6) => (3 2) (raices 1 2 3) => raices: discriminante negativo (dene raices (lambda (a b c) (let ((discriminante (− (expt b 2) (∗ 4 a c)))) (if (negative? discriminante) (error "raices: discriminante negativo") (list (/ (+ (− b) (sqrt discriminante)) (∗ 2 a)) (/ (− (− b) (sqrt discriminante)) (∗ 2 a))))))) Informática CcIa Entornos y procedimientos locales 4.5 Forma especial let: area-hexagono (area-hexagono 1) => 2.598076211353316 (area-hexagono (sqrt (sqrt 3))) => 4.499999999999999 (dene area-hexagono (lambda (lado) (let ((area-triangulo (lambda (base altura) (/ (∗ base altura) 2))) (apotema (lambda (lado) (∗ (sqrt 3) (/ lado 2))))) (∗ 6 (area-triangulo lado (apotema lado)))))) Informática CcIa Entornos y procedimientos locales 4.6 Forma especial let: asignación paralela (let ((a 0) (b (+ a 1)) (c (+ b 1))) (list a b c)) => reference to undened identier: a (let ((a 0)) (let ((b (+ a 1))) (let ((c (+ b 1))) (list a b c)))) => (0 1 2) Informática CcIa Entornos y procedimientos locales 4.7 Forma especial let∗ (let∗ ((variable1 valor1) (variable2 valor2) .. (variableN valorN)) expresión1 expresión2 .. expresiónM) Informática CcIa Entornos y procedimientos locales 4.8 Forma especial let∗: asignación secuencial (let∗ ((a 0) (b (+ a 1)) (c (+ b 1))) (list a b c)) => (0 1 2) (let ((x 5)) (let∗ ((x 3) (y (∗ 2 x))) (+ x y ))) => 9 Informática CcIa Entornos y procedimientos locales 4.9 Formas especiales let y let∗ y procedimientos recursivos (let ((fact (lambda (n) (if (zero? n) 1 (∗ n (fact (− n 1))))))) (fact 4)) => reference to undened identier: fact (let∗ ((fact (lambda (n) (if (zero? n) 1 (∗ n (fact (− n 1))))))) (fact 4)) => reference to undened identier: fact Informática CcIa Entornos y procedimientos locales 4.10 Forma especial letrec (letrec ((variable1 valor1) (variable2 valor2) .. (variableN valorN)) expresión1 expresión2 .. expresiónM) Informática CcIa Entornos y procedimientos locales 4.11 Forma especial letrec: ejemplos (letrec ((fact (lambda (n) (if (zero? n) 1 (∗ n (fact (− n 1))))))) (fact 4)) => 24 (letrec ((elemento 2) (altura 3) (proc (lambda (m n) (if (zero? n) 1 (expt m (proc m (− n 1))))))) (proc elemento altura)) => 16 Informática CcIa Entornos y procedimientos locales 4.12 Forma especial letrec: suma-elementos-it (dene suma-elementos-it (lambda (lista) (letrec ((aux (lambda (l ac) (if (null? l) ac (aux (cdr l) (+ ac (car l))))))) (aux lista 0)))) Informática CcIa Entornos y procedimientos locales 4.13 Forma especial letrec: cambia-it (dene cambia-it (lambda (x y lista) (letrec ((cambia-it-aux (lambda (l ac) (cond ((null? l) ac) ((equal? x (car l)) (cambia-it-aux (cdr l) (append ac (list y )))) (else (cambia-it-aux (cdr l) (append ac (list (car l))))))))) (cambia-it-aux lista ())))) Informática CcIa Entornos y procedimientos locales 4.14 Procedimientos y entornos locales (dene a 3) (dene x 0) (dene f (lambda (x y ) (+ x y ))) (dene g (lambda (x y ) (+ x y a))) (dene h (lambda (x y ) (+ x y a b))) (f 1 2) => 3 (g 1 2) => 6 (h 1 2) => reference to undened identier: b Informática CcIa Entornos y procedimientos locales 4.15 Procedimientos y entornos locales (dene a 2) (dene f (lambda (x) (∗ a x))) (f 5) => 10 (dene g (lambda (y ) (let ((a 3)) (f y )))) (g 5) => 10 (dene h (lambda (a) (f 5))) (h 3) => 10 Informática CcIa Entornos y procedimientos locales 4.16 Bibliografía [Abelson96] Cap. 1: Building abstractions with procedures. [Springer94] Cap. 5: Locally dened procedures. Informática CcIa Entornos y procedimientos locales 4.17