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

Jerônimo C. Pellegrini<br />

Dentro do corpo da função (lambda (k) ...), há uma chamada à continuação k.<br />

Quando a chamada acontecer, a <strong>com</strong>putação até ali será ignorada e a continuação usará o<br />

contexto anterior (de quando call/cc foi chamado).<br />

8.1.4 Exemplos<br />

O trecho de código a seguir soma um <strong>com</strong> “algo”: (+ 1 □).<br />

(+ 1 ( call /cc<br />

( lambda (k)<br />

(+ 2 (k 3)))))<br />

O procedimento call/cc tem um único argumento: (lambda (k) ...); o que será<br />

passado em k para este procedimento é exatamente o “estado atual” da <strong>com</strong>putação,<br />

(+ 1 □).<br />

Ao encontrar o lambda, o interpretador terá:<br />

( lambda (k)<br />

(+ 2 (k 3)))<br />

Mas o valor de k é uma continuação – um histórico de <strong>com</strong>putação, neste caso (+ 1 □).<br />

Ao chegar na forma (k 3), o valor de k é chamado <strong>com</strong>o procedimento, e ele<br />

descartará a <strong>com</strong>putação atual, trazendo a antiga de volta. O contexto atual passa a ser<br />

(+ 1 □). A <strong>com</strong>putação será (+ 1 3), e o resultado é 4!<br />

O programa escapou da <strong>com</strong>putação (“+ 2”) para continuar outra.<br />

Versão Preliminar<br />

(+ 1 (call/cc<br />

(lambda (k)<br />

(+ 2 (k 3)))))<br />

(k 3) escapa<br />

para este ponto<br />

Podemos também armazenar uma <strong>com</strong>tinuação em uma variável e usá-la quantas<br />

vezes quisermos:<br />

( define r #f)<br />

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

199

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

Saved successfully!

Ooh no, something went wrong!