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

(macroexpand ’(gera-mostra 1 ’simbolo ’(lista)))<br />

(begin (for-each display ’(1 ’simbolo ’(lista))) (newline) #t)<br />

Como a macro não avalia seus argumentos, é possível passar a ela <strong>com</strong>o parâmetros<br />

símbolos sem vinculação:<br />

(gera-mostra 1 simbolo (lista))<br />

1simbolo(lista)<br />

(macroexpand ’(gera-mostra 1 simbolo (lista)))<br />

(begin (for-each display ’(1 simbolo (lista))) (newline) #t)<br />

Uma maneira simples de escrever macros <strong>com</strong> define-macro é partir da expansão,<br />

depois escrever um procedimento que gere a expansão, e só então trocar define por<br />

define-macro.<br />

Por exemplo, a macro gera-mostra poderia ter sido desenvolvida assim:<br />

( lambda args<br />

( begin<br />

( for-each display args )<br />

( newline )<br />

#t)<br />

Um procedimento que gera o código acima é:<br />

( define gera-mostra<br />

( lambda args<br />

( list ’begin<br />

Versão Preliminar<br />

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

’( newline )<br />

#t )))<br />

(gera ’arg1 ’arg2)<br />

(begin (for-each display ’(arg1 arg2)) (newline) #t)<br />

Finalmente, trocando define por define-macro a macro é obtida:<br />

( define-macro gera-mostra<br />

( lambda args<br />

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