1. Práctica 1a
Funciones de listas y matemáticas en Common Lisp
Introducción
Common Lisp (List processing) es un lenguaje funcional que utiliza una notación prefija. Es un lenguaje
muy poderoso para el manejo de expresiones simbólicas. Sus elementos básicos son: átomos, listas y
cadenas de caracteres. En nuestro curso usamos un intérprete de Common Lisp que utiliza el lazo repetitivo
lee-evalúa-imprime. Common Lisp tiene interconstruidas una gran cantidad de funciones matemáticas,
lógicas, predicados, para el manejo de listas, etc. Es un lenguaje no tipado por lo que no es necesario
declarar variables ni tipos antes de usarse. Su principal inconveniente es su exagerado uso de paréntesis,
pero es algo a lo que sus fans llegan a acostumbrarse.
Objetivo
Utilizar las funciones propias de Common Lisp para la manipulación de listas y para el manejo de
operaciones matemáticas, aprendiendo el manejo de la notación prefija.
Actividades
1.- Suponiendo la siguiente definición:
(setq milista '((bush iraq) (nixon watergate) (lopez_obrador complot) (pri pemex_gate)
(pan amigos_de_fox) (ver tele) (no correo_electronico por_favor) (va mexico mundial)))
y basándose en las funciones de Clisp para la manipulación de listas, define y prueba las funciones
necesarias para generar las siguientes listas:
(setq x1 (first milista))
(setq x2 (second milista))
(setq x3 (third milista))
(setq x4 (fourth milista))
(setq x5 (fifth milista))
(setq x6 (sixth milista))
(setq x7 (seventh milista))
(setq x8 (eighth milista))
1.1.- (bush nixon lopez_obrador)
Función definida:
(setq ej1 (append(list (nth 0 x1) (nth 0 x2) (nth 0 x3 ) ) ) )
1.2.- (pemex_gate no)
Función definida:
(setq ej1 (append(list (nth 1 x4) (nth 0 x7) ) ) )
1.3.- (no ver tele por_favor)
Función definida:
(setq ej1(append(list (nth 0 x7) (nth 0 x6) (nth 1 x6) (nth 2 x7) ) ) )
1.4.- (iraq watergate complot pemex_gate amigos_de_fox)
Función definida:
(setq ej1(append (list (nth 1 x1) (nth 1 x2) (nth 1 x3) (nth 1 x4) (nth 1 x5) ) ) )
1.5.- (mexico no iraq)
Función definida:
(setq ej1 (append(list (nth 1 x8) (nth 0 x7) (nth 1 x1) ) ) )
1.6.- (correo_electronico pri pan)
2. Función definida:
(setq ej1 (append (list ( nth 1 x7) (nth 0 x4) (nth 0 x5) ) ) )
2.- Tomando cómo ejemplo el siguiente código que calcula el área y perímetro de un círculo:
(defun area-perimetro ()
(princ “teclea el radio, por favor: “)
(setq radio (read))
(setq perimetro (* 2 pi radio))
(setq area (* pi radio radio))
(format t “Radio: ~5F. Perimetro: ~5F. Area: ~5F” radio perimetro area)
)
2.1.- Define una función que pida los valores de a, b y c, evalúe y despliegue el resultado de la siguiente
función:
f = (b2
– 4ac)1/2
(defun ejercicio ()
(princ "Ingresa el valor de a: ")
(setq a (read))
(princ "Ingresa el valor de b: ")
(setq b (read))
(princ "Ingresa el valor de c: ")
(setq c (read))
(setq f (sqrt (- (expt b 2) (* 4 a c) ) ) )
(princ f)
)
2.2.- Prueba la función para los siguientes valores:
i) a=1, b=2, c=3 Resultado: __ 2.828 _______
ii) a=1, b=3, c=2 Resultado: ___1____________
iii) a= 10, b=20, c=5 Resultado: ___14.142_______
iv) a= 20, b=10, c=8 Resultado: ________________
3.- Un palíndromo es una secuencia de caracteres que se leen igual al derecho que al revés. La función
PALINDROMEP siguiente verifica si una lista es un palíndromo.
(defun palindromop (lst)
(equal lst (reverse lst)) )
Por ejemplo:
>(palindromop '(1 2 3 4 5 4 3 2 1))
T
>(palindromop '(a b b a))
T
>(palindromop '(1 2 3))
NIL
Escribe una versión recursiva de esta función y llámala R-PALINDROMOP sin usar la función reverse.
(Inserta aquí el código de R-PALINDROMOP)