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

Jerônimo C. Pellegrini<br />

( inc (* 2 x ))))))<br />

Uma tentativa de usar (mac 3) resultará em erro, porque o x do primeiro padrão (de<br />

mac) é o mesmo do segundo (o de inc):<br />

(macroexpand ’(mac 3))<br />

( let-syntax (( inc ( syntax-rules ()<br />

( inc (* 2 3)))<br />

((_ 3) (+ 1 3)))))<br />

O padrão de inc já foi escrito <strong>com</strong> o valor casado <strong>com</strong> x no padrão de mac.<br />

A solução para este problema é sempre usar símbolos diferentes em macros aninhadas:<br />

( define-syntax mac<br />

( syntax-rules ()<br />

((_ x)<br />

( let-syntax<br />

(( inc<br />

( syntax-rules ()<br />

((_ y) (+ 1 y )))))<br />

( inc (* 2 x ))))))<br />

7.4 macros <strong>com</strong> renomeação explícita<br />

7.5 problemas <strong>com</strong>uns a todos os sistemas de macro<br />

Versão Preliminar<br />

Há sutilezas e pequenas armadilhas inerentes ao desenvolvimento de macros, higiênicas<br />

ou não. Esta seção trata de alguns desses tópicos.<br />

7.5.1 Número de avaliações<br />

A macro a seguir é uma implementação de or:<br />

( define-syntax or*<br />

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

181

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

Saved successfully!

Ooh no, something went wrong!