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 -<br />

Jerônimo C. Pellegrini<br />

3.6.4 Exemplo: gerenciador de workflow<br />

3.7 escopo dinâmico<br />

(Esta seção está in<strong>com</strong>pleta)<br />

Usando escopo dinâmico, a vinculação válida para um nome é a mais recentemente<br />

criada durante a execução do programa. Por exemplo,<br />

( define proporcoes<br />

( lambda ( valores )<br />

( map ( lambda (v) (/ v total ))<br />

valores )))<br />

Em <strong>Scheme</strong> a variável total teria que ser global, de outra forma não estará no<br />

ambiente de proporcoes (que inclui os nomes visíveis de acordo <strong>com</strong> regras de escopo<br />

léxico):<br />

(let ((total 10)) (proporcoes ’(2 4)))<br />

Error: unbounded variable total<br />

Em uma linguegem <strong>com</strong> escopo dinâmico o código acima produziria a lista (1/5 2/5).<br />

Há diferença entre escopo estático e dinâmico apenas quando da determinação de<br />

nomes não globais e não locais.<br />

O uso de escopo dinâmico é usado normalmente para evitar a passagem de muitos<br />

parâmetros para procedimentos. Por exemplo,<br />

( let ((x ( calcula )))<br />

( let (( base 16))<br />

( display x)<br />

( newline ))<br />

( display x))<br />

Versão Preliminar<br />

Poderia ter o efeito de mostrar x em hexadecimal e depois usando a base que estava<br />

sendo usada antes. É importante notar que o uso de variáveis globais para emular escopo<br />

dinâmico, além de criar a possibilidade de conflitos de nomes no ambiente global, pode<br />

tornar o programa pouco legível:<br />

( let ((x ( calcula )))<br />

[ 27 de outubro de 2010 at 15:47 ]<br />

109

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

Saved successfully!

Ooh no, something went wrong!