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

Embora o exemplo anterior pareça um tanto inusitado e aparentemente sem propósito,<br />

a redefinição dos valores de procedimentos padrão <strong>com</strong>o * e + é útil em muitas situações: é<br />

possível definir um novo procedimento + que some, além dos tipos já existentes, números<br />

<strong>com</strong>plexos, intervalos, vetores ou quaisquer outros objetos para os quais a soma possa ser<br />

definida. Também é possível trocar o procedimento padrão por outro mais eficiente.<br />

1.3.1 Definindo novos procedimentos<br />

Os procedimentos usados nas seções anteriores a esta existem em qualquer ambiente<br />

<strong>Scheme</strong>, e são chamados de procedimentos primitivos. Além destes, podemos criar novos<br />

procedimentos usando os procedimentos primitivos; estes são chamados de procedimentos<br />

<strong>com</strong>postos.<br />

Em <strong>Scheme</strong> procedimentos <strong>com</strong>postos podem ser criados usando expressões lambda:<br />

( lambda ( arg1 arg2 ...)<br />

;; corpo do procedimento<br />

forma1<br />

forma2<br />

...)<br />

Quando uma forma lambda é avaliada, um procedimento é criado (mas não aplicado<br />

– trata-se apenas de sua descrição), e retornado. O exemplo abaixo é um procedimento<br />

que recebe dois argumentos (a e b) e calcula (ab) −1 :<br />

(lambda (a b) (/ 1 (* a b)))<br />

Quando este procedimento é aplicado, a forma é avaliada e seu valor é retornado.<br />

A aplicação deste procedimento consiste de sua descrição entre parênteses – o avaliador<br />

<strong>Scheme</strong> o aplicará porque é o primeiro elemento de uma lista:<br />

( (lambda (a b) (/ 1 (* a b))) 10 15 )<br />

1/150<br />

O que enviamos ao REPL foi uma lista:<br />

Versão Preliminar<br />

• O primeiro elemento da lista é (lambda (a b) (/ 1 (* a b))), um procedimento;<br />

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