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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

notas de aula -<br />

Jerônimo C. Pellegrini<br />

(define simbolo (gensym))<br />

simbolo<br />

G7<br />

(eqv simbolo ’G7)<br />

#f<br />

O símbolo retornado por gensym neste exemplo é representado <strong>com</strong>o G7, mas verificamos<br />

também que o símbolo “G7” definido pelo usuário não é equivalente ao gerado por<br />

gensym.<br />

Os símbolos gerados por gensym tem uma representação externa que pode lembrar<br />

símbolos escolhidos pelo programador, mas o sistema <strong>Scheme</strong> se lembrará que estes<br />

símbolos não podem ser eqv a quaisquer outros incluídos no texto do programa: um<br />

símbolo gerado por gensym só é igual a si mesmo.<br />

Assim, ao invés de incluir diretamente os símbolos start, stop e loop, podemos<br />

escrever a macro usando para eles símbolos únicos gerados por gensym, mas usando<br />

nomes <strong>com</strong>preensíveis <strong>com</strong>o apelidos:<br />

( define-macro better-for<br />

( lambda (i i1 i2 . body )<br />

;; Este let não é expandido: é código interno da macro<br />

( let (( start ( gensym ))<br />

( stop ( gensym ))<br />

( loop ( gensym )))<br />

;; A lista gerada abaixo será devolvida ao expandir a macro;<br />

;; Como usamos quasiquote e start/stop/loop estão incluídos<br />

Versão Preliminar<br />

;; SEM quote (<strong>com</strong> vírgula antes), o símbolo incluído na expansão<br />

;; da macro é o gerado por gensym.<br />

‘( let ((, start ,i1)<br />

(, stop ,i2 ))<br />

( let ,loop ((,i ,start ))<br />

(if (< ,i ,stop )<br />

( begin ,@body<br />

(, loop (+ 1 ,i )))))))))<br />

( let (( start 42))<br />

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

167

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

Saved successfully!

Ooh no, something went wrong!