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

(one . two)<br />

(set-car! x 1)<br />

x<br />

(1 . two)<br />

(set-cdr! x ’())<br />

x<br />

(1)<br />

A lista vazia, ’(), é uma constante e não é possível modificar seus car e cdr.<br />

Usando set-car! implementamos map!, uma versão de map que modifica a lista<br />

passada <strong>com</strong>o argumento ao invés de criar uma nova lista.<br />

( define map !<br />

( lambda (f lst )<br />

(if ( not ( null lst ))<br />

( begin ( set-car ! lst (f ( car lst )))<br />

( map ! f ( cdr lst ))))))<br />

Procedimentos <strong>com</strong>o map! que alteram estruturas de dados são muitas vezes chamados<br />

de destrutivos.<br />

3.3.1 Listas circulares<br />

É possível construir uma lista em que o cdr de um dos elementos é igual ao primeiro par<br />

da lista:<br />

( define make-circular !<br />

( lambda ( lista )<br />

( let loop ((l lista ))<br />

( cond (( null l)<br />

lista )<br />

(( null ( cdr l))<br />

( set-cdr ! l lista )<br />

Versão Preliminar<br />

lista )<br />

( else<br />

( loop ( cdr l )))))))<br />

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