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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

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

9 P R E G U I Ç A<br />

Ao encontrar uma expressão um interpretador pode avaliá-la imediatamente e determinar<br />

seu valor (<strong>com</strong>o em todos os exemplos vistos até agora) ou pode esperar até que o valor<br />

da expressão seja usado em alguma outra <strong>com</strong>putação. O primeiro caso é chamado de<br />

avaliação estrita, e o segundo de avaliação preguiçosa.<br />

Em <strong>Scheme</strong> a avaliação é estrita por default:<br />

(define a (quotient 1 0))<br />

Error: (quotient) division by zero<br />

O valor de a não era ainda necessário (ele não seria mostrado pelo REPL, e nem<br />

usado em alguma <strong>com</strong>putação). Mesmo assim o interpretador <strong>Scheme</strong> tentou calcular<br />

o valor imediatamente – e <strong>com</strong>o houve uma tentativa de dividir um por zero, o REPL<br />

devolveu uma mensagem de erro.<br />

9.1 delay e force<br />

Se, no entanto, pedirmos ao interpretador que guarde a expressão para avaliar mais tarde,<br />

ele o fará. Para isto usamos a macro delay:<br />

(define a (delay (quotient 1 0)))<br />

a<br />

#<br />

O valor de a é uma “promessa”: a é um procedimento que poderá retornar o valor de<br />

(quotient 1 0), mas somente quando for necessário. O procedimento force toma uma<br />

Versão Preliminar<br />

promessa e tenta obter seu valor:<br />

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

215

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

Saved successfully!

Ooh no, something went wrong!