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

6.3.1.2 def e set!<br />

Quando a S-expressão é uma definição de uma nova variável, o nome e valor são adicionados<br />

ao ambiente. Em nosso <strong>Scheme</strong> usaremos def ao invés de define.<br />

Usaremos def-name e def-val para o nome e valor de uma nova definição.<br />

(def name value)<br />

(list-ref x 2)<br />

(list-ref x 1)<br />

( define def-name ( lambda (x) ( list-ref x 1)))<br />

( define def-val ( lambda (x) ( list-ref x 2)))<br />

Assim, do-def! recebe uma expressão da forma (def a b), um ambiente, e cria um<br />

vínculo para a neste ambiente, armazenando no local de a o valor da expressão b, que é<br />

avaliada neste momento.<br />

( define do-def !<br />

( lambda ( exp env )<br />

( let (( new-binding ( cons ( def-name exp )<br />

( list ( eval # ( def-val exp ) env )))))<br />

(if ( null ( car env ))<br />

( set-car ! env new-binding )<br />

( begin<br />

;; O cdr do ambiente passa a ser o atual car<br />

Versão Preliminar<br />

;; seguido do cdr anterior. O efeito é de duplicar<br />

;; a cabeça da lista<br />

( set-cdr ! env<br />

( cons ( car env )<br />

( cdr env )))<br />

;; O car do ambiente passa a ser a nova vinculação<br />

( set-car ! env new-binding ))))))<br />

Quando se trata de um set!, o valor já armazenado no ambiente é modificado.<br />

( define do-set !<br />

( lambda ( exp env )<br />

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