Seguinte: Abstracção de Dados Acima: Dados Anterior: Átomos
Índice remissivo

Combinações de Dados

Para se combinar dados, é preciso que a linguagem possua uma ``cola'' que permita agrupar esses dados. Em Lisp, essa ``cola'' é implementada pela função cons.

A função cons cria um novo objecto que consiste na aglomeração de dois outros objectos, argumentos do cons. O cons é para o Lisp o mesmo que as tabelas (arrays) e estruturas (records, structs) são para as outras linguagens como Pascal ou C.

> (cons 1 2)
(1 . 2)
> (cons (cons 1 2) 3)
((1 . 2) . 3)

Dada uma combinação de objectos (um ``cons'') podemos obter o primeiro elemento da combinação usando a função car e o segundo usando a função cdr.

> (car (cons 1 2))
1
> (cdr (cons 1 2))
2

Note-se que aplicar o car ou o cdr a um cons não destroi esse cons. O cons de dois objectos é designado um par com ponto (dotted pair). Como é natural, um cons não é um objecto atómico:

> (atom (cons 1000 2000))
nil

Note-se que para combinar dois quaisquer objectos é necessário arranjar espaço na memória para indicar qual o primeiro objecto e qual o segundo. É a função cons que arranja esse espaço. De cada vez que ela é chamada, mesmo que seja para juntar os mesmos objectos, ela arranja um novo espaço de memória. Isto implica que a função eq é sempre falsa para o cons.

> (eq (cons 1 2) (cons 1 2))
nil

Exercício 33

Defina a função igual? que recebe dois objectos e testa se são os mesmos ou se são combinações de objectos iguais, i.e.

> (igual? 1 1)
t
> (igual? (cons (cons 1 2) (cons 2 3))
          (cons (cons 1 2) (cons 2 3)))
t

Resposta



Copyright António Leitão, 1995