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