7. Predicados
Práctica 02
Escribe una función que determine si un elemento dado es miembro de una lista.
* (es-miembro 'b '(a b c d))
T
* (es-miembro 'z '(a b c d))
NIL
Teoría
Los predicados son funciones que devuelven un valor booleano: t (verdadero) o nil (falso). Por convención, los nombres de los predicados terminan con la letra p (o P en funciones compuestas como null-p que se escribe nullp).
Common Lisp trata cualquier valor distinto de nil como verdadero en contextos booleanos, pero por convención se usa t para representar explícitamente verdadero.
* (if 42
"42 es verdadero"
"42 es falso")
"42 es verdadero"
* (if nil
"nil es verdadero"
"nil es falso")
"nil es falso"
Algunos predicados básicos para trabajar con tipos:
* (null nil)
T
* (null '())
T
* (null '(a b c))
NIL
* (atom 'a)
T
* (atom '(a b))
NIL
* (listp '(a b c))
T
* (listp 'a)
NIL
* (consp '(a b c))
T
* (consp nil)
NIL
La diferencia entre
listpyconspes sutil:listpdevuelve verdadero tanto para listas como paranil(la lista vacía), mientras queconspsolo devuelve verdadero para listas no vacías (cons cells).
Predicados numéricos:
* (zerop 0)
T
* (plusp 5)
T
* (minusp -3)
T
* (evenp 4)
T
* (oddp 3)
T
* (numberp 42)
T
* (integerp 3.14)
NIL
Predicados de comparación:
* (= 5 5)
T
* (= 5 3)
NIL
* (/= 5 3)
T
* (< 3 5)
T
* (> 10 2)
T
* (<= 5 5)
T
* (>= 10 5)
T
El predicado
=solo funciona con números. Para comparar otros tipos, usaeq,eql,equaloequalp.
Para comparar símbolos y referencias:
* (eq 'a 'a)
T
* (eql 5 5)
T
* (equal '(a b c) '(a b c))
T
* (equalp "Hola" "hola")
T
Las diferencias son:
- eq: compara si dos objetos son el mismo objeto en memoria (identidad).
- eql: como eq, pero también funciona correctamente con números y caracteres del mismo valor.
- equal: compara estructuralmente (listas, strings, etc.).
- equalp: como equal, pero ignora diferencias de mayúsculas en strings y compara números de diferentes tipos.
Operadores lógicos para combinar predicados:
* (and t t)
T
* (and t nil)
NIL
* (or nil t)
T
* (or nil nil)
NIL
* (not t)
NIL
* (not nil)
T
Estos operadores evalúan de forma perezosa (short-circuit evaluation):
* (and (> 5 3) (< 2 10))
T
* (or (> 5 10) (< 2 10))
T
This work is under a Attribution-NonCommercial-NoDerivatives 4.0 International license.
Desafíos de programación atemporales y multiparadigmáticos
Te encuentras ante un librillo de actividades, divididas en 2 niveles de dificultad. Te enfrentarás a los casos más comunes que te puedes encontrar en pruebas técnicas o aprender conceptos elementales de programación.
Buy the book
Comments
There are no comments yet.