Baixe o app para aproveitar ainda mais
Prévia do material em texto
Cap. 18 - Definições locais INF05008 - Fundamentos de algoritmos . Instituto de Informática Universidade Federal do Rio Grande do Sul Porto Alegre, Brasil http://www.inf.ufrgs.br 2011/2 .. Escopo de Definições.. . . ▸ Linguagens de programação permitem que se definam nomes para: ▸ Valores ▸ Posições de memória ▸ Funções e procedimentos ▸ Objetos ▸ É importante saber onde os nomes atribuídos são válidos (escopo) .. INF05008 Cap. 18 - Definições locais 2/20 .. Definições.. . . ▸ Até agora, vimos algumas definições especiais de Racket: ▸ (define (f a b) (+ a b)) (funções) ▸ (define x 42) (valores) ▸ (define-struct posn (x y)) (estruturas) ▸ Todas elas registram nomes que podem ser usados posteriormente: ▸ (f 1 2), x, (make-posn 2 4), posn-x, posn-y, posn? .. INF05008 Cap. 18 - Definições locais 3/20 .. Ambiente de Nomes.. . . ▸ Um ambiente de nomes é uma tabela de definições que associa cada nome a um objeto da linguagem ▸ f é a função “soma binária” ▸ x é o número 42 ▸ Inicialmente, o ambiente de nomes contém as definições padrão da linguagem Ex: +, -, empty, cons, pi, ... ▸ Cada comando de definição adiciona as definições do programador ao ambiente de nomes Ex: (define foo 77) => +, -, empty, cons, pi, foo, ... .. INF05008 Cap. 18 - Definições locais 4/20 .. Escopo Global.. . . ▸ Após a definição, o nome pode ser referenciado em várias partes do código (define x 42) (define (salário h) (* h 12)) (define (foo a) (+ a (salário x))) ▸ x, salário e foo estão definidos globalmente .. INF05008 Cap. 18 - Definições locais 5/20 .. Escopo Local.. . . ▸ Considere as seguintes definições: (1) (define x 42) (define (salário h) (* h 12)) (define (foo a) (+ a (salário h))) ▸ O quê faz foo? .. INF05008 Cap. 18 - Definições locais 6/20 .. Escopo Local (cont.).. . . ▸ Considere as seguintes definições: (2) (define a 42) (define (salário h) (* h 12)) (define (foo a) (+ a (salário a))) ▸ O quê faz foo agora? .. INF05008 Cap. 18 - Definições locais 7/20 .. Escopo Local (cont.).. . . ▸ Na situação (1), a definição de foo não seria aceita pelo compilador: ele acusaria que não conhece h ▸ Um nome de parâmetro só tem sentido dentro do corpo da função correspondente (escopo local) ▸ Como o nome h é um parâmetro de salário, ele não faz sentido dentro da definição de foo ▸ Em (2), foo utiliza somente o parâmetro recebido a, e não a definição global (que vale 42) ▸ Quando um parâmetro possui o mesmo nome que uma definição global, ele “sobreescreve” essa definição .. INF05008 Cap. 18 - Definições locais 8/20 .. Definições Locais.. . . ▸ Há situações onde é interessante realizar definições dentro de um contexto específico: ▸ Melhor organização de código ▸ Evitar repetição de cálculos .. INF05008 Cap. 18 - Definições locais 9/20 .. Definições Locais.. . . ▸ Racket provê uma sintaxe especial para especificar definições locais: (local (def1 def2 ... ) exp) ▸ Essa expressão resulta em exp, considerando def1, def2, … ▸ Atenção: para uso de local em Racket, a linguagem deve ser definida como Intermediate Student .. INF05008 Cap. 18 - Definições locais 10/20 .. Definições Locais: Execução.. . . ▸ A forma (local (def1 def2 ...) exp) executa da seguinte forma: 1. As definições são calculadas na ordem: def1, def2 ... 2. A expressão exp é calculada usando os nomes locais, e o resultado é retornado 3. As definições locais calculadas são descartadas .. INF05008 Cap. 18 - Definições locais 11/20 .. Definições Locais: Exemplo (1).. . . (define x 1) (define y 2) (define z 3) (define u (local ( (define x 10) (define y 20) ) (+ 4 x y z))) (define v (+ x y)) ▸ Qual o valor de u? E o valor de v? .. INF05008 Cap. 18 - Definições locais 12/20 .. Definições Locais: Exemplo (2).. . . (define y 10) (+ y (local ((define y 10) (define z (+ y y))) z)) ▸ Qual o valor final da função? ▸ Tente substituir y por y1 e z por z1 (dentro de local) ! .. INF05008 Cap. 18 - Definições locais 13/20 .. Definições Locais: Exemplo (3).. . . (define (soma x y) (local ( (define (soma-primeiro n) (+ x n)) ) (soma-primeiro y))) ▸ Como é a execução de soma? .. INF05008 Cap. 18 - Definições locais 14/20 .. Definições locais: exemplo (4).. . . ; calcula-raízes: number number number -> lista-de-números ; Dados 3 números, cria lista com raízes da equação quadrática ; ax^2 + bx + c = 0 onde a é o 1º número, b o 2º, e c o 3º (define (calcula-raízes a b c) (local ( (define delta (- (sqr b) (* 4 a c))) (define mb (- 0 b)) ) (cond [ (> delta 0) (list (/ (+ mb (sqrt delta)) (* 2 a)) (/ (+ mb (- 0 (sqrt delta))) (* 2 a)))] [ (= delta 0) (list (/ mb (* 2 a)))] [ (< delta 0) empty]))) .. INF05008 Cap. 18 - Definições locais 15/20 .. Uso de definições locais.. . . ▸ Quando uma função só existe para ser usada em um contexto específico, é interessante colocá-la em um escopo local (reforça a idéia de função auxiliar) ▸ Ex: insere em ordena ▸ Quando alguma subexpressão ocorre em mais de um ponto do corpo do programa, pode ser interessante definir seu resultado como um nome local para não ter que repetir cálculos ▸ Ex: delta em calcula-raízes .. INF05008 Cap. 18 - Definições locais 16/20 .. Uso de definições locais (cont.).. . . ;; ordena : lista-de-números -> lista-de-números (define (ordena ldn) (cond [(empty? ldn) empty] [else (insere (first ldn) (ordena (rest ldn)))])) ;; insere : número lista-de-números -> lista-de-números (define (insere n ldn) (cond [(empty? ldn) (list n)] [else (cond [(> n (first ldn)) (cons n ldn)] [else (cons (first ldn) (insere n (rest ldn)))])])) .. INF05008 Cap. 18 - Definições locais 17/20 .. Uso de definições locais (cont.).. . . ;; ordena2 : lista-de-números -> lista-de-números (define (ordena2 ldn) (local ((define (ordena ldn) (cond [(empty? ldn) empty] [else (insere (first ldn) (ordena (rest ldn)))])) (define (insere n ldn) (cond [(empty? ldn) (list n)] [else (cond [(> n (first ldn)) (cons n ldn)] [else (cons (first ldn) (insere n (rest ldn)))])]))) (ordena ldn))) .. INF05008 Cap. 18 - Definições locais 18/20 .. Exercícios.. . . 1. Avalie a expressão abaixo: (local ( (define (x y) (* 3 y)) ) (* (x 2) 5) ) (define (h n) (cond [(= n 0) empty] [else (local ( (define r (* n n)) ) (cons r (h (- n 1))) ) ])) (h 5) .. INF05008 Cap. 18 - Definições locais 19/20 .. Exercícios.. . . 2. Avalie a expressão abaixo: (define (f x z) (+ (local ( (define x 2) ; def1-1 (define y 4) ) ; def2-1 (local ; exp1 ( (define x 10) ; def1-2 (define z 3) ) ; def2-2 (+ (* x y) z) ) ) ; exp2 (* x z) ) ) (f 5 8).. INF05008 Cap. 18 - Definições locais 20/20
Compartilhar