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

(eval ’(+ 4 3) (scheme-report-environment 5))<br />

7<br />

null-environment só contém formas especiais:<br />

(eval ’(+ 4 3) (null-environment 5)) ;; => ERRO!<br />

(eval ’(if #f ’a ’b) (null-environment 5))<br />

’b<br />

O mais interessante:<br />

(eval ’+ (scheme-report-environment 5))<br />

<br />

(define + (eval ’+ (scheme-report-environment 5)))<br />

(+ 4 3)<br />

7<br />

Uma possível implementação de REPL é mostrada a seguir:<br />

( define my-repl<br />

( lambda ()<br />

( print "> ")<br />

( print ( eval ( read ) ( interaction-environment )))<br />

( newline )<br />

( my-repl )))<br />

Fica claro então o motivo do nome “read-eval-print” – que é a ordem em que são<br />

avaliados os procedimentos (print (eval (read) ...)).<br />

Se my-repl for usado em um interpretador <strong>Scheme</strong>, só haverá uma maneira de sair<br />

dele: enviando a forma (exit). No entanto, quando isso for feito, o hospedeiro <strong>Scheme</strong><br />

avaliará a forma e terminará sua execução também. Para evitar que isso ocorra, pode-se<br />

capturar a forma (exit) (isso evidentemente não impede que o usuário force o hospedeiro<br />

a terminar, por exemplo enviando a forma (if #t (exit))).<br />

( define my-repl<br />

( lambda ()<br />

( print "> ")<br />

( let (( form ( read )))<br />

(if ( not ( equal form ’( exit )))<br />

Versão Preliminar<br />

( begin ( print ( eval form<br />

( my-repl ))))))<br />

( interaction-environment )))<br />

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