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

posicao massa velocidade aceleracao<br />

particula<br />

Usaremos um procedimento auxiliar cria, que recebe um nome, uma lista de campos,<br />

e instancia um objeto <strong>com</strong> estes campos, já incluindo o nome da estrutura na posição zero<br />

do vetor:<br />

( define cria<br />

( lambda ( nome campos )<br />

( let ((v ( make-vector (+ 1 ( length campos )))))<br />

( vector-set ! v 0 nome )<br />

v )))<br />

Um procedimento is-of-type verifica se um objeto é de um dado tipo. Idealmente<br />

também verificaríamos se é um vetor, e se ele tem pelo menos um elemento, mas por<br />

simplicidade isso foi omitido:<br />

( define is-of-type <br />

( lambda ( obj type )<br />

( eqv type ( vector-ref obj 0))))<br />

Usaremos duas macros para criar novos tipos. A primeira, define-procs-campo, usa<br />

<strong>com</strong>o argumentos:<br />

• O índice do campo no vetor;<br />

• Uma lista <strong>com</strong> os nomes de getters e setters. Cada par getter/setter é uma lista –<br />

por exemplo, ((get-nome set-nome!) (get-valor set-valor!))<br />

Quando a lista for vazia, a macro expandirá para “(begin)”. Quando houver itens na<br />

lista, a expansão será<br />

Versão Preliminar<br />

( begin<br />

( define get ( lambda ( struc ) ( vector-ref struc i )))<br />

( define set ( lambda ( struc a) ( vector-set ! struc i a )))<br />

( define-procs-campo (+ 1 i) x))<br />

Onde get e set são variáveis de macro. A macro usa a si mesma recursivamente,<br />

incrementando o valor do índice do vetor.<br />

( define-syntax define-procs-campo<br />

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