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

( extend-env ( cdr vars )<br />

( cdr values )<br />

env ))))))<br />

Os novos vínculos são incluídos <strong>com</strong> cons, e por isso obedecem disciplina de pilha. É<br />

importante também que<br />

• Quando um ambiente é extendido por um lambda (ou let), as novas variáveis devem<br />

ser visíveis apenas dentro deste ambiente, e não no ambiente antigo, que foi extendido<br />

– o que de fato ocorre, porque referências anteriores só existiam aos vínculos mais à<br />

frente na lista;<br />

• Vínculos novos devem ter prioridade sobre os antigos (que já existiam antes do<br />

ambiente ser extendido). Isto evidentemente também acontecerá, já que find-in-env<br />

pesquisará os vínculos da cabeça até a cauda da lista.<br />

Por exemplo, o ambiente do primeiro let no código a seguir contém um vínculo x<br />

→ 10; já o ambiente do segundo let é extendido <strong>com</strong> x → 50 e y → 20:<br />

( let ((x 10))<br />

( display x)<br />

( let ((x 50)<br />

(y 20))<br />

(+ x y )))<br />

Supondo que o primeiro ambiente tinha apenas o vínculo para x, ele seria representado<br />

por ((x 10)). Ao avaliar o display, o interpretador fará:<br />

(find-in-env ’x ’((x 10)))<br />

10<br />

Já ao avaliar o + o interpretador usará uma extensão do ambiente anterior.<br />

(extend-env ’(x y) ’(50 20) ’((x 10)))<br />

((x 50) (y 20) (x 10))<br />

(find-in-env ’x ’((x 50) (y 20) (x 10)))<br />

50<br />

Versão Preliminar<br />

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

147

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

Saved successfully!

Ooh no, something went wrong!