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

;; code goes here:<br />

( lambda ()<br />

( add ( call /cc<br />

( lambda (c0)<br />

( set ! c c0)<br />

’talk1 ))))<br />

;; after:<br />

( lambda () ( add ’ disconnect )))<br />

(if (< ( length path ) 4)<br />

(c ’talk2 )<br />

( reverse path )))<br />

(connect talk1 disconnect connect talk2 disconnect)<br />

A variável path é inicializada <strong>com</strong> uma lista vazia; c será usada para guardar uma<br />

continuação; add adiciona um elemento a path. O programa chama então o procedimento<br />

(lambda () (add (call/cc ...)) dentro de uma forma dynamic-wind, determinando<br />

que sempre que o programa entrar e sair do escopo dinâmico deste procedimento, deve<br />

executar (lambda () (add ’connect)) e (lambda () (add ’disconnect)).<br />

Inicialmente, o trecho é executado uma única vez; no entanto, <strong>com</strong>o o if termina<br />

por chamar a continuação mais uma vez, o trecho é executado novamente – mas os dois<br />

procedimentos são novamente executados, e incluem connect e disconnect à lista path.<br />

A figura a seguir mostra a extensão dinâmica do procedimento (lambda () (add (call/cc ...)))<br />

e ilustra quando os outros procedimentos são chamados.<br />

Versão Preliminar<br />

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

203

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

Saved successfully!

Ooh no, something went wrong!