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

(( >= n ( length lst ))<br />

( error "n > max "))<br />

((= n 0)<br />

( car lst ))<br />

( else<br />

( list-ref-1 ( cdr lst ) (- n 1))))))<br />

A verificação de erros é feita a cada chamada recursiva; podemos evitar isto separando<br />

a verificação de erros da parte do procedimento que realmente encontra o n-ésimo<br />

elemento. Escreveremos um procedimento list-ref-aux que faz a busca, e só o chamaremos<br />

após ter verificado os parâmetros. Como list-ref-aux só faz sentido dentro deste<br />

procedimento, podemos definí-lo internamente <strong>com</strong> letrec:<br />

( define list-ref<br />

( lambda ( lst n)<br />

( letrec (( list-ref-aux ( lambda ( lst n)<br />

( cond (( not ( and ( list lst )<br />

(if (= n 0)<br />

( car lst ))<br />

( list-ref-aux ( cdr lst ) (- n 1)))))<br />

( integer n )))<br />

( error " list-ref : need a list and an iteger "))<br />

(( negative n)<br />

( error "n < 0"))<br />

(( >= n (- ( length lst ) 1))<br />

( error "n > max "))<br />

( else<br />

( list-ref-aux lst n ))))))<br />

Como usamos letrec, podemos fazer referência às variáveis que estamos definindo<br />

(neste caso list-ref-aux precisa se referir a si mesmo porque é recursivo).<br />

Implementações de <strong>Scheme</strong> devem obrigatoriamente oferecer list-ref.<br />

É tradicional em programação funcional usar (e construir) procedimentos que operam<br />

em listas. Os dois mais conhecidos e de utilidade mais evidente são map e reduce. O<br />

Versão Preliminar<br />

pocedimento list-map toma <strong>com</strong>o argumentos uma função e uma lista, e retorna uma<br />

nova lista cujos elementos são o resultado da aplicação da função a cada um dos elementos<br />

da lista original. Por exemplo,<br />

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