Tema 4 Entornos y procedimientos locales José A. Alonso M. José Hidalgo Álvaro Romero Dpto. Ciencias de la Computación e Inteligencia Artificial U NIVERSIDAD Informática DE S EVILLA Entornos y procedimientos locales 4.1 Entornos locales Contenido: • • • • Forma especial let. Forma especial let∗. Forma especial letrec. Procedimientos y entornos locales. Informática Entornos y procedimientos locales 4.2 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 Entornos y procedimientos locales 4.3 Forma especial let (let ((variable1 valor1) (variable2 valor2 ) .. . (variableN valorN )) expresión1 expresión2 .. . expresiónM ) Informática Entornos y procedimientos locales 4.4 Forma especial let: ejemplos (+ 5 x ) (let ((x 8)) (+ 5 x )) (+ x 5) (∗ a 8) (let ((x 8)) (∗ a x )) (define a 4) (∗ a 8) (let ((x 8)) (∗ a x )) (∗ a x ) Informática => => => => => reference 13 reference reference reference => => => 12 12 reference to undefined identifier: x to undefined identifier: x to undefined identifier: x to undefined identifier: a to undefined identifier: a Entornos y procedimientos locales 4.5 Forma especial let: ejemplos (define a 10) (define x 0) (let ((x 3) (y 2)) (∗ (+ x y ) b)) (let ((x 3) (y 2)) (∗ (+ x y ) a)) => reference to undefined identifier: b => 50 (let ((x 3)) (let ((y 2) (a (sqrt 4))) (∗ (+ x y ) b))) (let ((x 3)) (let ((y 2) (a (sqrt 4))) (∗ (+ x y ) a))) => reference to undefined identifier: b => 10 Informática Entornos y procedimientos locales 4.6 Forma especial let: raices (raices 1 −5 6) (raices 1 2 3) => => ( 3 2) raices: discriminante negativo (define 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 Entornos y procedimientos locales 4.7 Forma especial let: area-hexagono (area-hexagono 1) (area-hexagono (sqrt (sqrt 3))) => => 2.598076211353316 4.499999999999999 (define 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 Entornos y procedimientos locales 4.8 Forma especial let: asignación paralela (let ((a 0) (b (+ a 1)) (c (+ b 1))) (list a b c )) => reference to undefined identifier: a (let ((a 0)) (let ((b (+ a 1))) (let ((c (+ b 1))) (list a b c )))) => (0 1 2) Informática Entornos y procedimientos locales 4.9 Forma especial let∗ (let∗ ((variable1 valor1) (variable2 valor2 ) .. . (variableN valorN )) expresión1 expresión2 .. . expresiónM ) Informática Entornos y procedimientos locales 4.10 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 Entornos y procedimientos locales 4.11 Formas especiales let y let∗ y procedimientos recursivos (let ((fact (lambda (n) (if (zero? n) 1 (∗ n (fact (− n 1))))))) (fact 4)) => reference to undefined identifier: fact (let∗ ((fact (lambda (n) (if (zero? n) 1 (∗ n (fact (− n 1))))))) (fact 4)) => reference to undefined identifier: fact Informática Entornos y procedimientos locales 4.12 Forma especial letrec (letrec ((variable1 valor1) (variable2 valor2 ) .. . (variableN valorN )) expresión1 expresión2 .. . expresiónM ) Informática Entornos y procedimientos locales 4.13 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 Entornos y procedimientos locales 4.14 Forma especial letrec: suma-elementos-it (suma-elementos-it ’(1 2 3 4)) (suma-elementos-it ’(5 1 3)) (suma-elementos-it ()) => => => 10 9 (define 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 Entornos y procedimientos locales 4.15 Forma especial letrec: cambia-it (cambia-it ’a ’b ’(c d a b)) (cambia-it ’a ’b ’(c d b a b (a c) f)) => => ( c d b b) (c d b b b (a c) f) (define 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 Entornos y procedimientos locales 4.16 Procedimientos y entornos locales (+ 5 x ) ((lambda (x ) (+ 5 x )) 8) (+ x 5) (∗ a 8) ((lambda (x ) (∗ a x )) 8) (define a 4) (∗ a 8) ((lambda(x ) (∗ a x )) 8) (∗ a x ) Informática => => => => => reference 13 reference reference reference => => => 12 12 reference to undefined identifier: x to undefined identifier: x to undefined identifier: x to undefined identifier: a to undefined identifier: a Entornos y procedimientos locales 4.17 Procedimientos y entornos locales (define a 3) (define x 0) (define f (lambda (x y ) (+ x y ))) (define g (lambda (x y ) (+ x y a))) (define h (lambda (x y ) (+ x y a b))) ( f 1 2) ( g 1 2) ( h 1 2) Informática => => => 3 6 reference to undefined identifier: b Entornos y procedimientos locales 4.18 Procedimientos y entornos locales (define a 2) (define f (lambda (x ) (∗ a x ))) ( f 5) => 10 (define g (lambda (y ) (let ((a 3)) (f y )))) ( g 5) => 10 (define h (lambda (a) (f 5))) ( h 3) Informática => 10 Entornos y procedimientos locales 4.19 Bibliografía [Abelson–96] Cap. 1: “Building abstractions with procedures”. [Springer–94] Cap. 5: “Locally defined procedures”. Informática Entornos y procedimientos locales 4.20