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 - Jerônimo C. Pellegrini<br />

7.2.1 Captura de variáveis<br />

A macro a seguir é uma tentativa de implementar o <strong>com</strong>ando for, que poderia ser usado<br />

<strong>com</strong>o (for i 0 10 (display i)):<br />

( define-macro<br />

( lambda ( dirty-for i i1 i2 . body )<br />

‘( let (( start ,i1) ( stop ,i2 ))<br />

( let loop ((,i start ))<br />

( unless (>= ,i stop ) ,@body ( loop (+ 1 ,i )))))))<br />

( let (( start 42))<br />

1<br />

1<br />

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

O número 42 não foi impresso, <strong>com</strong>o se poderia esperar. A expansão da macro mostra<br />

o problema:<br />

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

( let (( start 1) ( stop 3))<br />

( let loop ((i start ))<br />

( unless (>= i stop ) ( display start ) ( newline )<br />

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

O símbolo start, usado na macro dirty-for, é também usado fora da macro; embora<br />

provavelmente não tenha sido a intenção do programador, as duas variáveis tem o mesmo<br />

vínculo.<br />

Isso pode ser remediado mudando o nome de start dentro da macro – por exemplo,<br />

ssttaarrtt, que dificilmente seria usado fora da macro. No entanto, não há garantia de<br />

que o símbolo não será usado fora da macro (na verdade certamente seria quando dois<br />

dirty-for forem aninhados), e nomes <strong>com</strong>o este tornam o código mais difícil de ler.<br />

Versão Preliminar<br />

A solução para este problema é um mecanismo para gerar novos símbolos, <strong>com</strong><br />

a garantia de que nunca serão iguais a símbolos escolhidos pelo programador. Este<br />

mecanismo é implementado no procedimento gensym, que podemos usar para gerar estes<br />

símbolos:<br />

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