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

( list ’begin<br />

( list ’ for-each ’ display ( list ’quote args ))<br />

’( newline )<br />

#t )))<br />

A macro abaixo ilustra novamente, e de maneira ainda mais clara, a diferença entre<br />

código executado durante o tempo de expansão da macro e durante a avaliação:<br />

( define-macro m<br />

( lambda (x)<br />

( display " Mensagem mostrada durante a expans ão da macro ")<br />

( newline )<br />

‘( begin ( display ,x)<br />

( newline ))))<br />

Dentro de um laço, a macro é expandida uma única vez, mas o código expandido é<br />

usado várias vezes:<br />

(do ((i 0 (+ 1 i))) ((= i 4)) (m ’teste))<br />

Mensagem mostrada durante a expansão da macro<br />

teste<br />

teste<br />

teste<br />

teste<br />

Quando macroexpand é usado, a mensagem é mostrada (porque a macro está sendo<br />

expandida), mas a lista resultante da expansão da macro não contem o display que<br />

mostra a mensagem:<br />

(macroexpand ’(m ’teste))<br />

Mensagem mostrada durante a expansão da macro<br />

(begin (display ’teste) (newline))<br />

Há um problema importante <strong>com</strong> o uso de define-macro, descrito na próxima<br />

subseção.<br />

Versão Preliminar<br />

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

165

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

Saved successfully!

Ooh no, something went wrong!