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

7.1 quasiquote<br />

Descrevemos no Capítulo 1 a forma especial quote, que impede a avaliação de seu<br />

argumento. Assim, (quote (+ 10 5)) resulta em uma lista, e não no número 15. Ao<br />

escrever macros não-higiênicas usaremos outras formas especiais que tem efeito parecido<br />

<strong>com</strong> o de quote: nossas macros são procedimentos que geram formas <strong>Scheme</strong> (que na<br />

grande maioria das vezes são listas).<br />

Se quisermos construir a lista (set! stack (cons elt stack)) mantendo todos os<br />

símbolos fixos exceto stack e elt, que devem ser parametros, podemos escrever<br />

( lambda ( stack elt )<br />

( list ’set ! stack ( list ’cons elt stack )))<br />

mas esta intercalação de list <strong>com</strong> símbolos, alguns <strong>com</strong> quote e outros sem, pode se<br />

tornar confusa.<br />

A forma especial quasiquote funciona <strong>com</strong>o quote, impedindo a avaliação de seu<br />

argumento, mas <strong>com</strong> uma exceção: a forma especial unquote, quando usada dentro de<br />

quote, determina que seu argumento seja avaliado. Podemos entender quasiquote e<br />

unquote <strong>com</strong>o duas chaves: uma que desliga a avaliação (quasiquote) e outra que a liga<br />

novamente (unquote). O exemplo a seguir ilustra o funcionamento de quasiquote.<br />

( quasiquote (( unquote (+ 1 2))<br />

(3 (+ 3 4))<br />

(+ 3 4)))<br />

Assim <strong>com</strong>o (quote forma) é normalmente abreviado por ’forma, também (quasiquote forma)<br />

é abreviado por ‘forma e (unquote forma) é abreviado <strong>com</strong>o ,forma. O exemplo anterior<br />

pode ser reescrito <strong>com</strong> as abreviações:<br />

‘(,(+ 1 2) (+ 3 4))<br />

(3 (+ 3 4))<br />

Nosso primeiro exemplo fica muito mais claro usando quasiquote: podemos pensar<br />

Versão Preliminar<br />

<strong>com</strong>o se tivéssemos um template de lista, e inserimos valores nas posições onde há vírgulas.<br />

( lambda ( stack elt )<br />

‘( set ! ,stack ( cons ,elt ,stack )))<br />

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

161

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

Saved successfully!

Ooh no, something went wrong!