Seguinte: Combinações de Dados Acima: Dados Anterior: Dados
Índice remissivo

Átomos

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.

Resposta

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

Seguinte: Combinações de Dados Acima: Dados Anterior: Dados
Índice remissivo

Copyright António Leitão, 1995