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

;; força o retorno <strong>com</strong> false:<br />

(k #f )))<br />

( set ! resultado-final ( begin f1 ...))<br />

#t )))) ;; não houve throw, retorne true<br />

;; restaure throw:<br />

( set ! throw old-throw )<br />

(if talvez resultado-final ( handler condicao )))))))<br />

O sistema de tratamento de exceções desenvolvido nesta seção é minimalista, mas<br />

ainda assim útil. Há diversos outros modelos de tratamento de exceção possíveis, mas<br />

este texto não os abordará.<br />

Ao desenvolver estes sistemas de exceções tivemos que usar uma variável no ambiente<br />

global. Isso foi necessário porque o trecho de código a ser executado, (begin f1 ...),<br />

pode conter chamadas a outros procedimentos que por sua vez chamam throw, e não<br />

tínhamos <strong>com</strong>o incluir facilmente vínculo para throw em todos estes ambientes a não ser<br />

através do ambiente global.<br />

8.5 co-rotinas<br />

Subrotinas são trechos de código <strong>com</strong> um ponto de entrada e um ponto de saída; aceitam<br />

parâmetros na entrada e retornam valores ao terminar. Os procedimentos na linguagem<br />

<strong>Scheme</strong> oferecem toda a funcionalidade de subrotinas (e mais que elas). Quando mais de<br />

uma subrotina é chamada, suas invocações ficam sempre empilhadas, e a última a ser<br />

iniciada deve ser a primeira a retornar.<br />

Versão Preliminar<br />

Co-rotinas são semelhantes a procedimentos: trechos de código que aceitam argumentos<br />

ao iniciar. No entanto, co-rotinas não obedecem a mesma disciplina de pilha que<br />

subrotimas: pode-se entrar e sair de uma co-rotina várias vezes, e co-rotinas diferentes<br />

podem ser intercaladas no tempo. Uma co-rotina pode retornar valor mais de uma vez (e<br />

neste caso é chamada de gerador).<br />

Como continuações capturam o contexto atual de um processo, parece natural usá-las<br />

para implementar co-rotinas.<br />

( define-syntax coroutine<br />

( syntax-rules ()<br />

(( coroutine arg resume body ...)<br />

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

207

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

Saved successfully!

Ooh no, something went wrong!