Já vimos que os números são um dos elementos primitivos do Lisp. Os símbolos (nomes de funções e variáveis) são outro dos exemplos. Estes elementos dizem-se atómicos, pois não podem ser decompostos.
Para se testar se um elemento é atómico pode-se usar a função atom:
> (atom 1) T
Exercício 32
Quando tentamos testar se o símbolo xpto é atómico, e escrevemos a expressão (atom xpto) recebemos um erro. Explique o que se passa.
Para que o Lisp possa considerar um símbolo por si só, i.e., sem o considerar uma variável, temos de usar a forma especial quote, que devolve o seu argumento sem o avaliar.
> (quote xpto) XPTO > (atom (quote xpto)) T
A razão de ser do quote está associada à distinção que existe entre as frases ``Diz-me o teu nome'' e ``Diz-me `o teu nome'''. No primeiro caso a frase tem de ser completamente interpretada para que o ouvinte possa dizer qual é o seu próprio nome. No segundo caso, as plicas estão lá para indicar ao ouvinte que ele não deve tomar o que está entre plicas à letra, e deve limitar-se a dizer ``o teu nome''. As plicas servem, pois, para distinguir o que deve ser tomado como é, e o que deve ser interpretado.
Existem várias funções para se testar a igualdade de elementos primitivos. Como já se viu, a igualdade de números é dada pela função =. Esta função compara números de todos os tipos.
> (= 1 1) t > (= 1 1.0) t
Em Lisp, existe unicidade de símbolos, i.e., dados dois símbolos com o mesmo nome, eles representam necessariamente o mesmo objecto, ou seja, o mesmo espaço da memória do computador. Isto permite que a comparação entre dois símbolos possa ser feita testando se eles representam o mesmo espaço, i.e., se apontam para a mesma zona da memória. A função eq realiza essa operação.
> (eq (quote a) (quote a)) t > (eq (quote a) (quote b)) nil
Note-se que a função eq pode não funcionar correctamente quando aplicada a números.
> (eq 1 1) t > (eq 111111111111111111111111111111111111 111111111111111111111111111111111111) nil
A razão do comportamento incoerente da função eq em números deve-se ao facto de os números pequenos poderem ser representados como dados imediatos, enquanto os números grandes ocupam espaço na memória, em zonas diferentes.
Para se testar símbolos e números do mesmo tipo existe uma outra função designada eql.
> (eql (quote a) (quote a)) t > (eql 111111111111111111111111111111 111111111111111111111111111111) t > (eql 1 1.0) nil