2.3.1. Predicados Generales

ÁTOMOS O LISTAS:


ATOM
Sabemos que dentro de las expresiones LISP se distinguen los átomos y las listas. El predicado ATOM verifica si un elemento determinado es un átomo
(atom elemento)
Devuelve nil si elemento es una lista y devuelve T en caso contrario. Debe tenerse cuidado, si se trata de un átomo simbólico, en tener claro si lo que se quiere evaluar es el síbolo o su contenido. Si no está precedido de QUOTE <'>, lo que se evalúa es el valor asociado:
_$ (atom a)
T
_$ (atom 'a)
T
_$ (setq a '(a b c))
(A B C)
_$ (atom a)
nil
_$ (atom 'a)
T
LISTP
Comprueba si un elemento es una lista
(listp elemento)
Devuelve T si elemento es una lista y devuelve nil en caso contrario. Obsérvese que como NIL es una lista vacía, (listp nil) devolverá T. Es decir, que todo átomo simbólico no asociado a un valor, devoverá T tanto para ATOM como para LISTP:
_$ !b
nil
_$ (atom b)
T
_$ (listp b)
T
_$ (listp 'b)
nil

ÁTOMOS SIMBÓLICOS:


VL-SYMBOLP
Identifica si un objeto especificado es o no un símbolo.
(vl-symbolp objeto)
Devuelve T si el objeto es un símbolo y nil si se trata de una constante (número o cadena) o una lista.
Este predicado ha sido incorporado por Visual LISP
_$ (vl-symbolp 'a)
T
_$ (vl-symbolp 15)
nil
_$ (vl-symbolp "abc")
nil
_$ (vl-symbolp '(a b c))
nil
BOUNDP
Cuando se trata de un átomo simbólico, puede ser necesario determinar si tiene asociado un valor. BOUNDP verifica la existencia de dicha asociación.
(boundp sím)
Devuelve T si sím tiene un valor asociado. Si no hay ningún valor asociado a sím (o se ha asociado a nil), boundp devuelve nil. Si sím es un símbolo no definido, se crea y se asocia a nil de forma automática.

NUMÉRICOS:


NUMBERP
Los átomos no simbólicos o constantes pueden ser números o cadenas. NUMBERP comprueba si el objeto es un número (real o entero)
(numberp elemento)
Devuelve T si elemento es un valor numérico y devuelve nil en caso contrario. El predicado complementario STRINGP, que comprobaría si se trata de una cadena no está definido en Visual LISP, aunque se puede encontrar entre los mensajes de error a la hora de depurar un programa. En el ejemplo que sigue el mensaje "STRINGP 2" significaría que se ha recibido un valor numérico (2) en lugar del argumento esperado del tipo cadena.
_$ (strcat 2 "b")
; error: bad argument type: stringp 2
MINUSP
Tratándose de valores numéricos en ocasiones se deberá comprobar si son negativos. MINUSP realiza dicha comprobación.
(minusp número)
Devuelve T si número es negativo y nil en caso contrario. Si el argumento no es numérico se recibirá un mensaje de error.
ZEROP
Igual que en el caso anterior, cuando se trata de valores numéricos ZEROP permite comprobar si un elemento se evalúa como cero
(zerop número)
Devuelve T si número es cero y nil en caso contrario.

LISTAS VACÍAS O CONSES:


En LISP el valor asociado al símbolo NIL (condición de falso) es la lista vacía <'()>. Cualquier símbolo que evalúe como NIL, devolverá T (cierto) al pasarlo al predicado LISTP. Para comprobar que se trata efectivamente de una lista, pero que dicha lista contiene algo (aunque fuera NIL) en las versiones anteriores de AutoLISP era necesario utilizar además de LISTP otros predicados tales como BOUNDP o NULL.

NULL
Comprueba si un elemento está definido como nil
(null elemento)
Devuelve T si elemento está asociado a nil y devuelve nil en caso contrario.
Puede emplearse para probar si se ha alcanzado el fin de una lista en sustitución del predicado ENDP de Common Lisp que falta en Visual LISP
_$ (null (caddr '(a b)))
T
VL-CONSP
La situación descrita en el párrafo anterior se resuelve empleando en su lugar el predicado CONSP (vl-consp para Visual LISP), que comprueba si el elemento analizado evalúa como una lista no nula
(vl-consp elem-lista)
Devuelve T, si elem-lista es una lista y no está vacía, de lo contrario devuelve nil. El término CONSP se deriva de la función básica de construcción de listas, que es la función CONS. Una lista no vacía es el resultado de aplicar, al menos una vez la función CONS.
Este predicado ha sido incorporado por Visual LISP
_$ (vl-consp a)
nil
_$ (setq a (cons 1 a))
(1)
_$ (vl-consp a)
T
El valor contenido en la lista puede incluso ser una lista vacía:
_$ (setq b (cons nil b))
(nil)
_$ (vl-consp b)
T
_$ (vl-consp '(())) ;equivalente a la línea anterior
T

PERTENENCIA A UNA LISTA:


MEMBER
Es un tipo particular de predicado, que comprueba si un átomo pertenece a una lista dada.
(member expr lista)
Si expr no aparece en la lista, member devuelve NIL. En caso de encontrarlo, devuelve el resto de la lista, desde el primer caso de la expresión encontrada. Lo devuelto por MEMBER actúa como T (cierto) ya que cualquier valor no nulo actuará como la negación de NIL (not NIL), es decir, cierto. Debe tenerse cuidado en el caso de los átomos simbólicos de pasar el nombre del símbolo precedido de QUOTE <'>.
_$ (member a '(c d 2 4 a '(a b) "a" 3.0 j))
nil
_$ (member 'a '(c d 2 4 a '(a b) "a" 3.0 j))
(A (QUOTE (A B)) "a" 3.0 J)

IGUALDAD O IDENTIDAD


Dos expresiones pueden considerarse iguales sin necesidad de que sean idénticas. Los predicados EQUAL y EQ permiten comprobar estas situaciones.
EQUAL
Determina si dos expresiones son iguales
(equal expr1 expr2 [aproximación])
La función equal determina si expr1 y expr2 se evalúan igual. Cuando se comparan dos números reales (o dos listas de números reales, como en el caso de los puntos), los dos números idénticos pueden presentar ligeras diferencias derivadas de los métodos utilizados para su cálculo. Para resolver esta situación, puede utilizarse un argumento numérico optativo, aproximación, para especificar la diferencia máxima que se puede admitir entre expr1 y expr2, para que sigan considerándose iguales.
EQ
Determina si dos expresiones son idénticas
(eq expr1 expr2)
La función eq determina si expr1 y expr2 están asociadas al mismo objeto (si apuntan a la misma dirección de memoria). Devuelve T si las dos expresiones son iguales y nil en caso contrario.
_$ (setq a (list 'm 'n 'o))
(M N O)
_$ (setq b (list 'm 'n 'o))
(M N O)
_$ (equal a b) ;las listas a y b son iguales
T
_$ (eq a b) ;pero NO son la misma lista
nil
_$ (eq (cons 'a 'b) (cons 'a 'b))
nil ;cada llamada a cons crea una nueva lista
_$ (eq '(a . b) '(a . b))
nil

En el caso de los valores constantes, equal y eq devuelven resultados similares, salvo lo explicado respecto a los números reales.
_$ (setq a 8)
8
_$ (setq b (+ 5 3))
8
_$ (eq a b)
T