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

( define stream-filter<br />

( lambda ( pred s)<br />

( cond (( stream-null (s))<br />

’ empty-stream )<br />

(( pred ( stream-car s))<br />

( stream-cons ( stream-car s)<br />

( stream-filter pred ( stream-cdr s ))))<br />

( else<br />

( stream-filter pred ( stream-cdr s ))))))<br />

Ao contrário de filter, o procedimento stream-filter não percorre a estrutura<br />

inteira aplicando pred e selecionando elementos (se o implementássemos assim ele<br />

nunca terminaria!) O que stream-filter retorna é uma nova stream cujo car é o primeiro<br />

elemento da stream que satisfaça pred (veja o segundo caso do cond) e cujo car é uma<br />

promessa. A <strong>com</strong>putação prometida alié de aplicar novamente stream-filter no resto da<br />

stream original.<br />

( define stream-map<br />

( lambda (f s)<br />

(if ( stream-null (s))<br />

’ empty-stream<br />

( stream-cons (f ( stream-car s))<br />

( stream-map f ( stream-cdr s ))))))<br />

o funcionamento de stream-map é parecido <strong>com</strong> o de stream-filter: o car é f<br />

aplicado ao car da stream original, e o cdr é a promessa de aplicar f a todos os outros<br />

elementos da stream.<br />

Um procedimento particularmente útil é o que transforma uma stream em lista. Obviamente<br />

não é possível transformar uma stream infinita em lista, mas um procedimento<br />

que tome os n primeiros elementos de uma stream é bastante útil, e sua implementação é<br />

muito simples:<br />

( define stream-take<br />

( lambda (s n)<br />

(if ( positive n)<br />

Versão Preliminar<br />

( cons ( stream-car s)<br />

( stream-take ( stream-cdr s)<br />

(- n 1)))<br />

’())))<br />

222<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!