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

6.3.1.5 eval<br />

O procedimento eval aceita <strong>com</strong>o parâmetros uma S-expressão e um ambiente, e seu<br />

valor de retorno é definido em casos: se a S-expressão é “auto-avaliante” (ou seja, seu<br />

valor é ela mesma), ela é retornada sem modificações.<br />

( define auto-eval <br />

( lambda ( exp )<br />

(or ( boolean exp )<br />

( number exp )<br />

( string exp )<br />

( primitive-proc exp )<br />

( and ( pair exp )<br />

( is-a exp ’proc )))))<br />

Um símbolo será sempre interpretado <strong>com</strong>o nome de uma variável, por isso podemos<br />

definir um predicado var que idêntico a symbol:<br />

( define var symbol )<br />

Qualquer lista não vazia pode ser uma aplicação de procedimento, e o procedimento<br />

is-a verifica se uma lista inicia <strong>com</strong> um certo símbolo.<br />

( define is-a <br />

( lambda ( exp sym )<br />

( eqv ( car exp ) sym )))<br />

( define proc pair )<br />

Por exemplo, para a forma f = (if ...), temos que (is-a f ’if) é verdadeiro.<br />

Para as formas dentro de lambda ou begin é necessário um mecanismo para avaliação<br />

de várias formas em sequência. Para isso implementamos eval-seq.<br />

Versão Preliminar<br />

( define eval-seq<br />

( lambda ( exp env )<br />

( cond (( null exp )<br />

( error " eval-seq : null sequence "))<br />

(( null ( cdr exp ))<br />

( eval # ( car exp ) env ))<br />

( else<br />

( eval # ( car exp ) env )<br />

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