Seguinte: Programação Imperativa Acima: Listas Anterior: Listas de Argumentos
Índice remissivo

Tipos Aglomerados

Um tipo aglomerado é um tipo abstracto de informação que é composto exclusivamente pela aglomeração de outros tipos abstractos. O conjunto dos racionais é um exemplo pois, como vimos, um racional não é mais do que uma aglomeração de dois inteiros. As operações fundamentais de um tipo aglomerado são os seus construtores e selectores, embora possam existir outras. Como vimos, para um racional, as operações mais utilizadas eram o construtor racional e os selectores numerador e denominador, mas também foram definidos alguns testes e os transformadores de entrada/saída.

Os tipos aglomerados são extremamente utilizados. Por este motivo é costume as linguagens de alto nível fornecerem ferramentas próprias para os tratar. Pascal, por exemplo, permite defini-los com a forma especial record, enquanto que a linguagem C usa, para o mesmo efeito, o struct.

Para exemplificarmos a utilização de tipos aglomerados podemos considerar a definição de um automóvel. Um automóvel é caracterizado por uma marca, um modelo, um dado número de portas, uma cilindrada, uma potência, etc. Para simplificar, podemos considerar só as três primeiras. O construtor de um objecto do tipo automóvel não tem mais que agrupar as informações relativas a cada uma daquelas características. Para isso, podemos usar a função list. Assim, criamos o construtor do tipo da seguinte forma:

(defun novo-automovel (marca modelo portas)
  (list marca modelo portas))

Os selectores do tipo automóvel limitam-se a determinar de que é que um dado objecto daquele tipo é composto:

(defun automovel-marca (automovel)
  (nth 0 automovel))

(defun automovel-modelo (automovel) (nth 1 automovel))

(defun automovel-portas (automovel) (nth 2 automovel))

Estando na posse destas funções, podemos criar um automóvel específico, por exemplo:

> (novo-automovel 'honda 'civic 2)
(honda civic 2)

Dado aquele objecto do tipo automóvel, podemos estar interessados em alterar-lhe o número de portas, passando-as de 2 para 4, por exemplo. Contudo, para manipularmos um tipo abstracto devemos restringirmo-nos às operações desse tipo. Precisamos, portanto, de criar novas operações que nos permitem modificar um objecto. Para o tipo automóvel poderiamos definir:

(defun muda-automovel-marca (automovel nova-marca)
  (muda-n-esimo 0 automovel nova-marca))

(defun muda-automovel-modelo (automovel novo-modelo) (muda-n-esimo 1 automovel novo-modelo))

(defun muda-automovel-portas (automovel novo-portas) (muda-n-esimo 2 automovel novo-portas))

A função muda-n-esimo recebia um número n, uma lista e um novo elemento, e substituia o n-ésimo elemento da lista pelo novo elemento. Esta função não alterava a lista original, produzindo uma nova lista. Desta forma, qualquer destas funções do tipo automóvel deixa o automóvel a modificar absolutamente inalterado, produzindo um novo automóvel. Por este motivo, estas operações devem ser vistas como construtores do tipo automóvel, pois elas criam um novo automóvel a partir de um outro já existente. Elas não permitem alterar um automóvel já criado.


Seguinte: Programação Imperativa Acima: Listas Anterior: Listas de Argumentos
Índice remissivo

Copyright António Leitão, 1995