Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Maguiña Pérez
EAPIS-FISI UNMSM
INTRODUCCIÓN
Con la intención de aprender aspectos del lenguaje Common Lisp tales como primitivas para imprimir en
pantalla y para definir variables, definir funciones propias, y también algunas de las estructuras de control
disponibles en el lenguaje, enseguida se plantean varias preguntas. En anexo se describen funciones de
Common Lisp que podrán ser útiles para resolver las preguntas planteadas mediante el entorno LispWorks.
Los códigos respectivos que responden a dichas preguntas, deben estar consignados en un archivo con
extensión .lsp; cada alumno debe enviar el archivo con dichos códigos al correo electrónico:
rmaguinap@unmsm.edu.pe.
PREGUNTAS
1) Definir una función que cada vez que se ejecute, el resultado sea:
(la delincuencia ha aumentado en nuestra ciudad)
2) Dados 2 números imaginarios, los cuales deberán ser pasados por teclado, se pide:
a) Escribir un programa que implemente un menú de opciones para obtener la suma (suma dos números
imaginarios; p.e. 2 + 3i con 6 + 4i), resta o multiplicación de los números imaginarios. Use la
condicional COND. Se desea que el programa interactúe con el usuario de modo escoja la operación
que desea. Para imprimir por pantalla los mensajes que se requieran use PRINT.
b) Modificar el programa del anterior ítem de modo que luego del ingreso de los números por teclado, y
del resultado obtenido, el prompt retorne para un nuevo ingreso de números.
Nota: un número imaginario en Common Lisp se representa así: #C(a b); donde ‘a’ se refiere a la parte real
y ‘b’ a la imaginaria.
3) Definir una función que implemente la función signo
1 si u 0
f(u)=
-1 u<0
4) Se desea crear el juego “Adivina el Número”. La computadora pensará un número aleatorio entre 1 y 20,
y te pedirá que intentes adivinarlo. La computadora te dirá si cada intento es muy alto o muy bajo. Tú
ganas si adivinas el número en seis intentos o menos. Este es un buen juego para codificar ya que usa
números aleatorios y bucles, y recibe entradas del usuario en un programa corto.
Dado que este programa es un juego, nos referiremos al usuario como el jugador. Pero llamarlo “usuario”
también sería correcto. Así es como el programa se muestra al jugador al ejecutarse. El texto que el jugador
ingresa está en negrita.
a) Usando LOOP-WHILE-DO para los bucles, RANDOM para la generación de números aleatorios y
FORMAT para imprimir los mensajes, codificar el juego en Common Lisp.
b) Usando ahora variables locales donde sea factible, codificar el juego en Common Lisp.
IA 2020-2, Grupo 2 Prof. Rolando A. Maguiña Pérez
EAPIS-FISI UNMSM
ANEXO
LIST
- n argumentos: argumentos pueden ser átomos o listas
- crea una lista con los argumentos declarados
EJM.
(list 'luna 'sol) → (luna sol)
(list 'ppc 'ap 'apra) → (ppc ap apra)
(list 'luna nil) → (luna nil)
(list '(solo)) → ((solo))
APPEND
- n argumentos: argumentos deben ser listas
- une las listas en una sola lista
EJM.
(append '(1 3 5 7) '(2 4 6)) → (1 3 5 7 2 4 6)
(append '(aa bb cc) '(dd ee ff))→ (aa bb cc dd ee ff)
*DIFERENCIAS
(cons '(lu ma mi) '(ju vi sa do)) → ((lu ma mi) ju vi sa do)
(list '(lu ma mi) '(ju vi sa do)) → ((lu ma mi) (ju vi sa do))
(append '(lu ma mi) '(ju vi sa do)) → (lu ma mi ju vi sa do)
IA 2020-2, Grupo 2 Prof. Rolando A. Maguiña Pérez
EAPIS-FISI UNMSM
EJM.
CL-USER > (reverse '(aa bb cc dd))
(DD CC BB AA)
LENGTH
Sintaxis:
(length <expresión>)
- argto: 1 lista
- proporciona el número de elementos de una lista o el número de caracteres de una cadena o string
EJMS.
CL-USER > (length '((a b) kk mm))
3
NTH
Sintaxis:
(nth <entero> <lista>)
- argto: 1 número entero y 1 lista
- proporciona el n-ésimo elemento de la lista contando desde elemento 0
(A B C D E F )
Indices de posición 0 1 2 3 4 5
EJM.
CL-USER 49 > (nth 3 '(u alianza cristal san-martin muni))
SAN-MARTIN
REMOVE
- Formato: (remove Elemento Lista)
- Recibe dos argumentos, cualquier elemento y una lista, y devuelve una nueva lista con todos los elementos
de dicha lista excepto el elemento declarado:
EJM.
IA 2020-2, Grupo 2 Prof. Rolando A. Maguiña Pérez
EAPIS-FISI UNMSM
DEFCONSTANT
Formato:
(defconstant cte1 form1)
- form1 es evaluada y el resultado se almacena en la constante cte1.
- Devuelve siempre el nombre de la constante que se acaba de definir.
- El valor de una constante no se puede modificar.
- No se puede definir más de una constante en una expresión.
EJM.
CL-USER 23 > (defconstant cervantes '(miguel de cervantes y saavedra))
CERVANTES
La función DEFCONSTANT
Según el ejemplo, cervantes es una constante cuyo valor es una lista con el sobrenombre del escritor. Es
decir, siempre que se evalúe cervantes, el resultado será su valor:
Obsérvese que el símbolo cervantes aparece dos veces en la definición: como símbolo dentro de la lista y
como nombre de la constante. En realidad, tanto las constantes como las variables no son sino simples
símbolos a los que se ha asociado un valor.
DEFVAR
Formato:
(defvar *var1* [valor_inicial])
- Valor_inicial que es opcional es evaluado y el resultado se almacena en la variable global *var1*.
- Devuelve el nombre de la variable que se acaba de definir.
- No se puede definir más de una variable en una expresión.
EJM.
CL-USER 28 > (defvar *humedad-prom* 80)
*HUMEDAD-PROM*
*T-RA*
Si se define una misma variable más de una vez, sólo tiene efecto la primera definición. P.e., si se define de
nuevo la variable *humedad-prom* con otro valor inicial, permanece el valor dado la primera vez:
Si se define una variable, pero no se le da valor, utilizar esa variable dará error porque no tiene un valor
asignado. Por ejemplo, evaluar *t-ra* da error porque es una variable que no tiene asociado ningún valor:
DEFPARAMETER
Formato:
(defparameter *var1* [valor_inicial])
- Valor_inicial que es opcional es evaluado y el resultado se almacena en la variable global *var1*.
- Devuelve el nombre de la variable que se acaba de definir.
3) Asignación
Para poder asignar o modificar el valor de una variable, se utiliza SETQ (proviene de “set quote”):
SETQ
La función SETQ siempre devuelve el valor que se ha asignado a la variable. P.e. se puede modificar el valor
de *humedad-prom* que con defvar no se pudo re-asignar, así:
SETF
Los símbolos se utilizan para dar nombre a las variables. Una variable puede tomar como valor cualquier objeto
LISP.
EJM.
CL-USER > (let ((x 2))
(sqrt x))
1.4142135
Análisis
Se inicializa la variable local x a 2, el cuerpo está constiuido por una sola expresión que lo que hace es
obtener la raíz cuadrada de x.
I/O
FORMAT
Formato general:
(format t “Lo que se quiere imprimir en pantalla”)
Esta función normalmente devuelve el valor de NIL, pero como efecto lateral produce que se escriba en
pantalla. Cuando se quiere escribir en la pantalla el primer argumento debería de ser el símbolo t . El
segundo argumento debe ser una cadena devuelve NIL.
EJM.
> (format t "no existe solucion al problema")
no existe solucion al problema
NIL
La cadena de control del format puede contener también órdenes para formateado especial, las cuales
comienzan con el caracter ‘‘~’’. Enseguida, se presentan las principales directivas usadas en format.
~%: produce que format empiece una línea nueva.
> (format t "La suma ~& de los numeros")
IA 2020-2, Grupo 2 Prof. Rolando A. Maguiña Pérez
EAPIS-FISI UNMSM
La suma
de los numeros
NIL
~S: inserta la representación impresa de un objeto LISP en el mensaje que el FORMAT imprime; para cada ~S
en la cadena de control del format, FORMAT requiere de un argumento extra.
EJM.
> (format t "De ~S a ~S en ~S minutos" 'Lima '(Callao) 15)
De LIMA a (CALLAO) en 15 minutos
NIL
~A: imprime un objeto sin usar las comillas; se diferencia de ~S porque este incluye las comillas mientras que
~A no las incluye.
EJM.
> (defun prueba (x)
(format t "~&Con comillas: ~S" x)
(format t "~&Sin comillas: ~A" x))
PRUEBA
PRINT
Formato general:
(print par1)
par1 puede ser un átomo o una lista, o una cadena; imprime par1 y luego vuelve a imprimirlo
Caso par1 fuese una cadena:
EJM.
> (print “Hola, mundo”)
“Hola, mundo”
“Hola, mundo”
Caso par1 fuese un átomo o una lista, PRINT escribe éste y luego vuelve a imprimirla.
EJM.
> (print 'fisi)
FISI
FISI
Condicionales
COND
Formato:
IA 2020-2, Grupo 2 Prof. Rolando A. Maguiña Pérez
EAPIS-FISI UNMSM
EJM. Definir una función que compare dos números y que emita un mensaje adecuado sobre el resultado
obtenido.
(defun compara (x y)
(cond ((> x y) (format t "el primero es mayor que el segundo"))
((= x y) (format t "los numeros son iguales"))
((< x y) (format t "el primero es menor que el segundo"))
)
)
> (compara 39 67)
el primero es menor que el segundo
NIL
IF
Formato:
(if (condición) <acción si se cumple condición> <acción si no se cumple>)
(defun va (x)
(if (< x 0) (* x -1) x))
> va(-4)
4
ITERACIONES
DOLIST
Formato:
(dolist ((var lista [resultado])
cuerpo)
A
B
C
D
IA 2020-2, Grupo 2 Prof. Rolando A. Maguiña Pérez
EAPIS-FISI UNMSM
NIL
EJM.
Dada una lista de números enteros, definir una función que coloque los impares en una lista y los pares en
otra.
Sol.
(setq L1 nil)
(setq L2 nil)
EJM.
CL-USER > (lista-pares '(3 5 7 9 12 14))
la lista de pares es (14 12 8)
NIL
CL-USER > L1
(14 12 8)
LOOP
Formato:
(loop for <variable> in <lista> do
cuerpo)
EJM.
CL-USER > (loop for x in ’(a b c ) do (print x))
A
B
C
NIL
Formato:
(loop while <condición> do
cuerpo)
Realiza las iteraciones mientras se cumpla la condición.
EJMS.
res
)
(1 2 3 4 5 6 7)
AA
BB
DD
NIL
Formato:
(loop until <condición> do
cuerpo)
EJM.
RAMP