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.1 Unquote-splicing<br />

Ao construir listas constantes, podemos querer fazer algo semelhante a cons: dada uma<br />

lista constante (f1 f2 f3), queremos a lista (f0 f1 f2 f3). Não conseguiremos faze-lo<br />

<strong>com</strong> quasiquote:<br />

( let ((a ’(f1 f2 f3 )))<br />

‘(f0<br />

,a))<br />

(f0 (f1 f2 f3))<br />

Nosso problema é que o valor de a é uma lista, e o quasiquote usado na segunda<br />

linha usou este valor para osegundo elemento de outra lista. Se quisermos “espalhar” os<br />

elementos da lista a dentro de outra lista, temos que citá-la <strong>com</strong> unquote-splicing:<br />

( let ((a ’(f1 f2 f3 )))<br />

‘(f0 ( unquote-splicing a )))<br />

(f0 f1 f2 f3)<br />

A abreviação para (unquote-splicing forma) é ,@forma.<br />

( let ((a ’(f1 f2 f3 )))<br />

‘(f0 ,@a ))<br />

(f0 f1 f2 f3)<br />

7.2 macros não higiênicas: define-macro<br />

Diversas variantes do mecanismo define-macro eram usados informalmente por muitas<br />

implementações <strong>Scheme</strong> antes de R 5 RS. Como não havia padronização, sua sintaxe pode<br />

variar, mas não muito. Uma das variantes de define-macro tem a seguinte forma:<br />

Versão Preliminar<br />

( define-macro MACRO-NAME<br />

( lambda MACRO-ARGS<br />

MACRO-BODY ...))<br />

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