08.02.2015 Views

Programação Funcional e Concorrente com Scheme

Programação Funcional e Concorrente com Scheme

Programação Funcional e Concorrente com Scheme

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

notas de aula - Jerônimo C. Pellegrini<br />

3.6 fechos<br />

Nesta seção retiraremos a restrição a procedimentos <strong>com</strong> variáveis livres que havíamos<br />

imposto no início do Capítulo. Uma característica importante de <strong>Scheme</strong> e de outras<br />

linguagens <strong>com</strong> suporte a procedimentos de primera classe é a possibilidade de, ao passar<br />

um procedimento <strong>com</strong>o parametro (ou retorná-lo), enviar junto <strong>com</strong> ele seu ambiente. O<br />

procedimento abaixo ilustra <strong>com</strong>o isso pode ser feito.<br />

( define retorna-procedimento<br />

( lambda ()<br />

( let (( uma-variavel 1000))<br />

( lambda () uma-variavel ))))<br />

Como <strong>Scheme</strong> implementa escopo estático, uma-variavel sempre será visível dentro<br />

dos blocos de código internos ao let que a definiu – inclusive o (lambda () uma-variavel).<br />

Quando este procedimento é retornado por retorna-procedimento, ele continua podendo<br />

acessar uma-variável:<br />

(define proc (retorna-procedimento))<br />

(proc)<br />

1000<br />

O nome dado ao procedimento proc (que leva junto seu ambiente léxico contendo a<br />

vinculação de uma-variável) é fecho 2 . Há programadores que chamam fechos de let over<br />

lambda (“let sobre lambda”), lembrando a maneira <strong>com</strong>o são implementados 3 .<br />

Um fecho é <strong>com</strong>posto de um procedimento e de seu ambiente léxico.<br />

O diagrama a seguir mostra os quadros e ambientes após a avaliação de (define<br />

retorna-procedimento ...) e (define proc ...).<br />

Versão Preliminar<br />

2 Closure em Inglês.<br />

3 Let Over Lambda é também o título de um livro sobre técnicas avançadas de programação em Common<br />

Lisp[21].<br />

102<br />

[ 27 de outubro de 2010 at 15:47 ]

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!