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

Jerônimo C. Pellegrini<br />

( letrec (( local-control-state<br />

( lambda ( arg ) body ...))<br />

( resume<br />

( lambda (c v)<br />

( call /cc<br />

( lambda (k)<br />

( set ! local-control-state k)<br />

(c v ))))))<br />

( lambda (v)<br />

( local-control-state v ))))))<br />

A macro coroutine usa dois argumentos seguidos de várias formas: o primeiro<br />

argumento, arg, é o argumento inicial para a co-rotina; o segundo, resume, é o nome do<br />

procedimento que será usado para transferir o controle para outra co-rotina; após os dois<br />

argumentos vem o corpo da co-rotina.<br />

Dentro do letrec criamos uma variável local-control-state, que sempre terá <strong>com</strong>o<br />

valor o ponto de entrada corrente para esta co-rotina. Inicialmente, este ponto de entrada<br />

é o procedimento (lambda (arg) body ...), mas cada vez que o controle deixar esta<br />

co-rotina, o valor desta variável passará a ser a continuação corrente. A outra variável local,<br />

resume, será trocada pelo nome que o programaor der ao procedimento de transferência<br />

de controle; este procedimento aceita dois argumentos, c e v – o primeiro é o procedimento<br />

para o qual queremos transferir o controle e o segundo é o argumento que passaremos<br />

para este outro procedimento. Após chamar call/cc, o procedimento resume guarda a<br />

coninuação corrente em local-control-state, para que seja possível retomar mais tarde,<br />

e chama c <strong>com</strong> argumento v. Em seguida, local-control-state é chamado.<br />

Quando outra co-rotina chamar retornar a esta, também chamará o procedimento<br />

Versão Preliminar<br />

local-control-state, retornando assim ao ponto onde esta rotina havia sido interrompida.<br />

O exemplo a seguir mostra duas co-rotinas, ping e pong, transferindo controle entre<br />

si várias vezes.<br />

( define write-line<br />

( lambda ( line )<br />

( display line )<br />

( newline )))<br />

;; Como faremos referência a pong antes de definí-lo <strong>com</strong>o<br />

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