Buscar

18 local

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

Continue navegando