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

( throw ’ catastrofe ))<br />

-- ERRO: catastrofe --<br />

(throw "Uh")<br />

-- ERRO: uh --<br />

O procedimento de tratamento de erros passado para o try permaneceu vinculado à<br />

variável global handler – e não há sequer <strong>com</strong>o prever quando esta modificação ocorrerá,<br />

porque ela só acontece quando uma exceção é levantada!<br />

Há uma solução simples para este problema: a macro try pode se encarregar de<br />

guardar o valor anterior da variável throw – e para que isto faça sentido, deve haver<br />

um valor anterior de throw! Uma chamada a throw fora de algum try deve resultar<br />

em uma mensagem minimamente informativa. A nova versão de try mostrada a seguir<br />

implementa estas mudanças.<br />

( define throw<br />

( lambda ( arg )<br />

( format " Throw chamado fora de try !")<br />

( newline )<br />

( display ( format " Argumento de throw : ~a~%" arg ))))<br />

( define-syntax try<br />

( syntax-rules ( on-error :)<br />

((_ on-error : handler f1 ...)<br />

( begin<br />

Versão Preliminar<br />

( let * (( old-throw throw ) ;; antigo throw guardado<br />

( condicao #f)<br />

( resultado-final #f) ;; presumindo falha<br />

( talvez<br />

( call /cc<br />

( lambda (k)<br />

( set ! throw ( lambda (co)<br />

;; handler deve ser chamado c/<br />

;; argumento de throw, então<br />

;; é necessário guardá-lo:<br />

( set ! condicao co)<br />

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