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

( better-for i 1 3 ( display start ) ( newline )))<br />

42<br />

42<br />

A expansão da macro mostra <strong>com</strong>o os símbolos foram trocados:<br />

(macroexpand ’(better-for i 1 3 (display start) (newline)))<br />

( let (( G11 1)<br />

( G12 3))<br />

( let G13 ((i G11 ))<br />

(if (< i G12 )<br />

( begin ( display start )<br />

( newline )<br />

( G13 (+ 1 i ))))))<br />

Como durante a escrita da macro o programador pode usar variáveis <strong>com</strong> nomes<br />

razoáveis (<strong>com</strong>o start, stop e loop), os nomes “estranhos” na expansão não são um<br />

problema.<br />

Se ainda assim for interessante usar nomes que façam sentido mesmo após a expansão<br />

da macro (para facilitar a depuração do programa, por exemplo), basta passar ao<br />

procedimento gensym uma string, e ela será usada <strong>com</strong>o base para o nome do símbolo:<br />

(gensym "start")<br />

start14<br />

Versão Preliminar<br />

Embora a macro better-for não capture variáveis definidas pelo programador no<br />

contexto onde a macro é usada, em situações fora do <strong>com</strong>um ainda é possível que a macro<br />

se <strong>com</strong>porte de maneira diferente do esperado:<br />

( let (( if ’x))<br />

( less-dirty-for i 1 3<br />

( display i )))<br />

O programa acima muda a vinculação do símbolo if, usado na macro, e a após a<br />

expansão de less-dirty-for será:<br />

( let (( if ’x))<br />

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