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

( display let ))<br />

( let (( if even ))<br />

( display if ))<br />

( let (( if even ))<br />

( display (if #f 1 2)))<br />

7.3.7 Armadilhas de syntax-rules<br />

O transformador de macros syntax-rules é útil e fácil de usar quando se quer escrever<br />

macros simples. Ao desenvolver macros que envolvem mais engenhosidade surgem<br />

diversos pequenos problemas e armadilhas que devem ser conhecidos pelo programador.<br />

7.3.7.1 Símbolos livres no corpo da macro<br />

Se no corpo de uma macro há referência a um símbolo que não estava no padrão que<br />

casou, a vinculação dele será buscada no ambiente em vigor quando a macro foi definida<br />

(antes de ser expandida em qualquer lugar):<br />

( define-syntax soma<br />

( syntax-rules ()<br />

((_ a b)<br />

(+ a b c ))))<br />

A macro foi definida fora de qualquer procedimento ou bloco, portanto o c se refere<br />

ao vínculo global do símbolo c. Uma primeira tentativa de uso da macro falhará porque c<br />

não está definido:<br />

(soma 3 4)<br />

ERROR: unbound variable: c<br />

Usar let cria um novo ambiente <strong>com</strong> um novo vínculo para c, mas este não é o<br />

Versão Preliminar<br />

vínculo global para c, portanto não resolverá o problema:<br />

(let ((c 10)) (soma 3 4))<br />

ERROR: unbound variable: c<br />

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

179

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

Saved successfully!

Ooh no, something went wrong!