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

’( ”Julius” cesar roma<br />

”Winston” primeiro-ministro inglaterra<br />

”Napoleao” imperador franca)<br />

A implementação de zip precisa separar os cars e cdrs de todas as listas e adicionar<br />

os cars gradualmente, até que as listas tenham se esgotado:<br />

( define zip<br />

( lambda listas<br />

(if ( any null listas )<br />

’()<br />

( let (( cars ( map car listas ))<br />

( cdrs ( map cdr listas )))<br />

( append cars ( apply zip cdrs ))))))<br />

O procedimento zip sabe quantas listas são passadas <strong>com</strong>o argumentos; um procedimento<br />

unzip não tem <strong>com</strong>o adivinhar o número de listas, e portanto precisa dele <strong>com</strong>o<br />

argumento.<br />

( define unzip<br />

( lambda (n lista )<br />

( let loop (( result ( make-list n ( list )))<br />

( lst lista ))<br />

(if (< ( length lst ) n)<br />

( map ! reverse ! result )<br />

( let (( to-unzip ( take lst n )))<br />

( loop ( map ! cons to-unzip result )<br />

( drop lst n )))))))<br />

Uma mão de poquer pode ser representada <strong>com</strong>o uma lista de cartas, e cada carta<br />

pode por sua vez ser representada por uma lista onde o primeiro elemento determina o<br />

valor e o segundo o naipe da carta. Por exemplo,<br />

Versão Preliminar<br />

’((4 copas )<br />

(9 paus )<br />

(k ouros )<br />

(k paus )<br />

(k copas ))<br />

O procedimento unzip2 é parecido <strong>com</strong> unzip, mas aceita listas de pares:<br />

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