Nothing Special   »   [go: up one dir, main page]

Guia de Laboratorio Lisp Salinas-Zegarra

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 19

GUIA DE LABORATORIO

LISP

DOCENTE
DR. HUGO VEGA HUERTA

ALUMNOS
SALINAS LIENDO EDUARDO ALONSO
ZEGARRA VILLANUEVA JUAN DIEGO

2019-II
Guía de programación en LISP

1. INTRODUCCIÓN

Lisp (históricamente LISP) es una familia de lenguajes de


programación de computadora de tipo multiparadigma con larga historia y una
inconfundible y útil sintaxis basada en la notación polaca.

En la presente guía fue hecha con el objetivo de encaminar al estudiante por sus primeros
pasos en LISP a fin de que pueda dominar sin problemas dicho lenguaje de programación.

En la presente guía se busca representar problemas prácticos en prolog basados en casos


reales desde lo más sencillo a lo más complejo a fin de que el usuario puede dominar sin
problemas dicho software.

Funciones CAR y QUOTE:


CAR
CAR admite un único argumento que debe ser una lista o una expresión cuyo valor sea una
lista y devuelve el primer elemento de dicha lista. Como LISP siempre interpreta una lista
como una llamada a una función, necesitamos una manera de pasar una lista a CAR sin
que LISP trate de procesarla como llamada a función.

QUOTE
Con este objetivo se suministra la función QUOTE . Una lista dentro de una
función QUOTE no se tratará de evaluar como llamada a una función. La llamada a la
función QUOTE se puede abreviar utilizando el signo apóstrofe < ’ >.

Funciones CDR y NTH:


CDR recibe también una lista y devuelve el resto de la lista después de eliminar el primer
elemento (CAR lista). Por lo tanto puede contemplarse como la función
complementaria de CAR. Una manera de interpretar una lista en LISP es como la
conjunción de un CAR y un CDR. Se podrá acceder a cualquier término de una lista
mediante los anidamientos apropiados de CAR y CDR.

1 (CAR lista) ;primer término


2 (CAR (CDR lista)) ;segundo término
3 (CAR (CDR (CDR lista))) ;tercer término

y así sucesivamente... Para simplificar las expresiones se permite crear nombres


compuestos para anidamientos de CAR y CDR de la siguiente manera:

1 comenzando por una primera letra C


2 una letra A por cada CAR o una D por cada CDR
3 terminando con una letra R
1 así (CAR (CDR (CDR lista))) sería lo mismo que (CADDR lista).

De esta manera podemos construir hasta 28 funciones distintas para acceso a listas.
Según Johnson* estas 28 concatenaciones se pueden dividir en cuatro grupos, tomando
como base la profundidad a que pueden acceder en listas anidadas en varios niveles.

1  Asignación
setq: Asiga valores a una variable

Ejemplo de uso: (setq nueve '9)

(setq l '(a b c))

let y let*: Asigna valores a variables y genera listas de tal modo que en let las
modificaciones en la muestra de datos en pantalla de los valores son locales y
en let* son globales

Ejemplo de uso: (setq nueve '9)

(let ((nueve 'interior)

(y nueve))

(list nueve y))

Ejemplo de uso: (setq nueve '9)

(let* ((nueve 'interior)

(y nueve))
(list nueve y))

2  Aritméticas
+, -, *, / : Son las operaciones para sumar, restar, multiplicar y dividir

Un ejemplo de uso es: (+ (* 2 3) 5)

% : Esta no funciona en clisp, venía en el libro de emacs

1+, 1- : Incrementa/Decrementa en uno el valor. Es una operació n unaria.

Un ejemplo de uso es: (1+ 9)

max, min : Devuelve el valor má ximo de una lista

Un ejemplo de uso es: (max 23 4 5 234 654)

float: Devuelve el valor en coma flotante

Ejemplo de uso: (float (/ 22 7))

round: redondea un valor al entero má s cercano

Ejemplo de uso: (round (/ 22 7))

expt: calcula potencias elevando su primer argumento a su segundo

Ejemplo de uso: (expt 2 3)

sqrt: calcula raices cuadradas


Ejemplo de uso: (sqrt 9)

abs: calcula el valor absoluto

Ejemplo de uso: (abs -3)

random: calcular un nú mero aleatorio de 0 a N-1

Ejemplo de uso: (random '5)

3  Comparación
>, <, >=, <= : Mayor que, Menor que, Mayor o igual que, Menor o igual que. Só lo
nú meros

Un ejemplo de uso: (< (max 5 6) 6)

/= : Distinto que. Só lo para nú meros

Ejemplo de uso: (/= 5 4)

equal: Evalú a si el valor de los dos argumentos es la misma expresió n

Ejemplo de uso: (equal (+ 2 2) 4)

eql: Evalú a si el valor de los dos argumentos es el mismo símbolo o nú mero.


Ejemplo: Fallará si intentamos (eql '(x y) '(x y))

eq: Evalú a si el valor de los dos argumentos es el mismo símbolo.

Ejemplo: Fallará si intentamos (eq '(x y) '(x y))

= : Evalú a si el valor de los dos argumentos es el mismo nú mero.

Ejemplo: Falla si intentamos ver si (= 'x 'x)

zerop: Evalú a si un nú mero es cero.

plusp: Evalú a si un nú mero es positivo.

listp: Evalú a si el argumento es una lista.

evenp: Evalú a si un nú mero es par.

oddp: Evalú a si un nú mero es impar.

numberp: Evalú a si es un nú mero.

symbolp: Evalú a si es un símbolo.

if, when, unless y case: Sirven para ejecutar o no acciones si se cumple una
condició n.

nilbody

sort: ordena una lista en el orden que se le dicta como argumento

Ejemplo de uso: (sort '(3 1 4 1 5 9) #'<)

Al igual que nconc y delete sort altera el contenido de la lista.


4  Lógicas
and, or y not: Son las expresiones ló gicas de toda la vida

Ejemplo de uso: (and (< 5 6) T)

5  Manejo de Secuencias (son tanto listas como


cadenas)
elt: devuelve el elemento que ocupa la posició n x de la secuencia.

Ejemplo de uso: (elt '(a b c) 0)

length: cuenta el nú mero de elementos de nivel superior que hay en una lista.

Ejemplo de uso: (length '(platon socrates aristóteles))

reverse: invierte el orden de los elementos de nivel superior de la secuencia.

Ejemplo de uso: (reverse '(platon socrates aristóteles))

replace: reemplaza los elementos de la seq1 con los elementos de seq2. seq1 se
modifica de manera destructiva

Ejemplo de uso:

(defvar sent '(1 2 3 4 5 6 7 8 9 0))

(replace sent '("Second" "Third") :start1 1 :end1 9)

Ejemplo de uso:

(defvar from '(1 2 3))

(defvar to '(a b c))


(replace from to :start1 1 :end1 2)

6  Manejo de cadenas
string=, string-equal: nos dice si dos cadenas son iguales, la diferencia entre
uno y otro es que string= diferencia minú sculas y mayú sculas y string-equal, no.

Ejemplo de uso: (string= "abc" "ABC")

char=, char-equal: nos dice si dos caracteres son iguales, la diferencia entre uno
y otro es que char= diferencia minú sculas y mayú sculas y char-equal, no.

Ejemplo de uso: (char= #\a #\a)

search: nos sirve para determinar si una cadena está contenida en otra. Si lo
está devolverá la posició n donde empieza la correspondencia, en otro caso
devuelve NIL.

Ejemplo de uso: (search "Márquez" "García Márquez")

Ejemplo de uso: (search "MÁRQUEZ" "García Márquez" :test #'char-


equal) ;; así se evita que distinga entre mayúsculas y minúsculas.

concatenate: concatena cadenas

Ejemplo de uso: (concatenate 'string "hola" "adios")

7  Manejo de listas
setq: Asigna valores a una lista

Ejemplo de uso: (setq amigos '(jesus gema gregorio))

let: Asigna valores a una lista


atom: Nos dice si el elemento es un á tomo o si es una lista.

endp: Comprueba si la lista está vacía

first: Devuelve el primer elemento de una lista. Es lo mismo que car

Ejemplo de uso: (first amigos)

rest: Devuelve la lista sin el primer elemento. Es lo mismo que cdr

Ejemplo de uso: (rest amigos)

cadr: Entre c y r puede haber una combinació n a y d que denotan el


encadenamiento de first y rest.

Ejemplo de uso: (caddr amigos) = (first (rest (rest amigos)))

second, third, fourth,…: Devuelve el segundo, tercer, o cuarto elemento de una


lista (hay hasta el tenth)

Ejemplo de uso: (third amigos)

cons: Inserta un nuevo elemento en la primera posició n de una lista.

Ejemplo de uso: (cons 'lucas amigos)

;; Lo que realmente hace cons es hacer que el primer apuntador de


la lista sea 'lucas.

append: Combina dos listas en una

Ejemplo de uso: (setq friends (append amigos '(b c)))

;; Lo que realmente hace append es copiar amigos en la nueva


lista (en nuestro caso friends) y, luego anexa '(b c).
nconc: fusiona dos listas en una. La diferencia con append es que nconc lo hace
haciendo que el ú ltimo apuntador de la primera lista apunte al primero de la
segunda.

Ejemplo de uso: (nconc amigos '(b c))

;; Si ahora llamamos a amigos desde clisp el resultado no es el


que tal vez esperábamos.

list: Elabora una lista con sus argumentos

Ejemplo de uso: (list '1 '2 '3)

push y pop: meter y sacar un elemento a una lista. Fíjate que podemos usar
cons y rest para esos menesteres, la diferencia es que aquí los cambios alteran
el contenido de la variable.

Ejemplo de uso: (pop amigos)

nthcdr: elimina los n primeros elementos de una lista

Ejemplo de uso: (nthcdr 3 amigos)

butlast: elimina los n ú ltimos elementos de una lista

Ejemplo de uso: (butlast amigos 2)

last: devuelve una lista en la que se han eliminado todos los elementos menos el
ú ltimo.

Ejemplo de uso: (last amigos)

assoc: Sirve para recuperar elementos de una lista de asociació n. Una lista de
asociació n es una lista de sublistas, en la que el primer elemento de cada
sublista se utiliza como una clave para recuperar la sublista completa.
Ejemplo de uso: (setq sara '((estatura 1.7) (peso 65)))

(assoc 'peso sara)

(setq fechas '((startyear 2013) (startmonth 06) (endyear 2013)


(endmonth 12)))

(assoc 'startyear fechas)

member: comprueba si un elemento pertenece a una lista y devuelve una lista


con los elementos que hay desde el elemento coincidente

Ejemplo de uso: (member 'c '(b c a))

delete: se deshace de las ocurrencias del primer argumento que aparezcan en el


nivel superior del segundo.

Ejemplo de uso: (delete 'jorge amigos)

Nótese que delete ha borrado del todo a jorge de amigos.

remove: se deshace de las ocurrencias del primer argumento que aparezcan en


el nivel superior del segundo. Aparentemente hace lo mismo que delete, pero
en la prá ctica delete cambia el contenido de la lista y remove no.

Ejemplo de uso: (remove 'jorge amigos)

Ejemplo avanzado de uso: (remove '(cara cruz) '((alfa omega) (cara


cruz) (zenit nadir)) :test #'equal)

Ejemplo avanzado de uso: (remove 'cruz '((alfa omega) (cara cruz)


(zenit nadir)) :test #'member)

8  Funciones que tienen funciones como


argumentos
mapcar: Simplifica las operaciones de transformació n de listas. Se proporciona
el procedimiento de transformació n y la lista de elementos a transformar.

Ejemplo de uso: (mapcar #'oddp '(1 2 3))

(mapcar #'- '(1 2 3 4))

remove-if, remove-if-not: Simplifica las operaciones de filtració n de listas. De


esta manera, remove-if elimina todos elementos que satisfacen un predicado
dado.

Ejemplo de uso: (remove-if #'evenp '(1 2 3 4))

reduce: Similar a mapcar, simplifica operaciones de filtrado de secuencias.

Ejemplo de uso:

(reduce (lambda (best item)

(if (and (oddp item) (> item best))

item

best))

'(1 4 6 5 8 2 7))

count-if, find-if: Simplifican las operaciones de conteo y localizació n.

Ejemplo de uso: (count-if #'evenp '(1 2 3 4))

(find-if #'evenp '(1 2 3 4))

funcall: Permite definir procedimientos que tengan procedimientos como


argumentos.

Ejemplo de uso: (funcall #'first '(1 2 3))


apply: usa el valor de su primer argumento sobre los elementos de su segundo
argumento, el cual debe ser una lista.

Ejemplo de uso: (apply #'append '((e1 e2) (e3 e4)))

(apply #'+ 1 2 3 '(4 5 6))

lambda: define procedimientos anó nimos, es un defun sin nombre del


procedimiento, ú til para dejar má s claro lo que va a hacer el procedimiento. No
debe usarse si el procedimiento puede usarse unas cuantas veces.

Ejemplo de uso: (mapcar #'(lambda (x) (eq x 2)) '(3 4 2 5))

Ejemplo de uso: (defun igualdad (y list) (mapcar #'(lambda (x) (eq x


y)) list)) -> Ej. anterior llevado a función

Ejemplo de uso: ((lambda (x) (list x x)) '(lambda (x) (list x x)))
-> programa q se escribe a si mismo

9  Iteración sobre números y listas


DOTIMES: (dotimes (<contador> <límite-superior> <resultado>) <cuerpo del
bucle>)

Ejemplo de uso:

(dotimes (i (length '(2 3 4 5)))

(if (= 5 (elt '(2 3 4 5) i))

(print "encontrado 5")))

DOLIST: (dolist (<contador> <lista> <resultado>) <cuerpo del bucle>)

Ejemplo de uso:
(dolist (i '(2 3 5 6))

(if (equal 5 i) (format t "encontrado ~a" i)))

DO: es mas general que dolist y dotimes

Ejemplo de uso:

(defun nuevo-expt (m n)

(do ((resultado 1) ;;se inicializa


parámetros

(exponente n))

(when (zerop exponente) ;;condición de


terminación

(return resultado))

(setq resultado (* m resultado)) ;;cuerpo del


bucle

(setq exponente (- exponente 1))))

LOOP: Só lo se detiene al encontrarse con un return (loop <cuerpo>)

PROG1 y PROGN: ambos interpretan secuencias, progn devuelve el resultado de


la n-ésima funció n y prog1 de la primera.

Ejemplo de uso: (progn (setq a 'x) (setq b 'y) (setq c 'z))

10 Funciones de Lectura y Escritura

print, format: son operaciones de salida de texto.


Ejemplo de uso: (format t "~%¡Hola!~%Estoy listo para empezar.")

read: es una operació n de lectura de texto.

Ejemplo de uso: (setq dato-usuario (read))

read-line: absorve caracteres hasta donde aparece un retorno de carro o un fin


de archivo. Luego produce una cadena con los caracteres q preceden el retorno
de carro o el final del archivo, seguido de NIL, al menos que read-line encuentre
el final del archivos mientras está leyendo una línea, en ese caso es T.

Ejemplo de uso: (read-line)

Ejemplo de uso:

(with-open-file (flujo-de-pacientes "pacientes.lsp"


:direction :input)

(dotimes (n 4) (print (read-line flujo-de-pacientes))))

Ejemplo de uso:

(setq a "line 1

line2")

(read-line (setq input-stream (make-string-input-stream a)))

read-char: lee un cará cter

Ejemplo de uso: (read-char)

with-open-file: permite leer y escribir en archivos plantilla: (with-open-file


(<nombre del flujo> <"ruta del archivo">

:direction <:input o :output>) …)

Ejemplo de uso:
(with-open-file (flujo-de-pacientes "pacientes.lsp"

**:direction :input)

(do ((paciente (read flujo-de-pacientes nil 'eof)

(read flujo-de-pacientes nil 'eof)))

((eq paciente 'eof))

(format t "~%¡Hola!~%Estoy listo para empezar.


~a" (first paciente))))

open: permite escribir en archivos

Ejemplo de uso: (defvar *st-local* (open "/tmp/local1" :direction


:output :if-exists :rename-and-delete))

eval: es una operació n que lee y evalú a.

Ejemplo de uso: (eval (read))

11 Funciones de Recursivas
Obtener nú meros impares
Mayor elemento de una lista

Multiplos de 5

A PARTIR DE ESTA LISTA (4 1 6 (3 6 5 2) 8 (4 1) 9 7) REALIZAR LOS


SIGUIENTES PROBLEMAS:

Problema 1

Obtener la siguiente lista: ( (Σ𝑁°𝑖𝑚𝑝𝑎𝑟𝑒𝑠 𝑛𝑜 ℎ𝑜𝑗𝑎𝑠 Σ𝑁°𝑝𝑎𝑟𝑒𝑠 𝑛𝑜 ℎ𝑜𝑗𝑎𝑠)


𝑁𝑢𝑚𝑒𝑟𝑜𝑠 𝑝𝑎𝑟𝑒𝑠 ℎ𝑜𝑗𝑎𝑠)

Rpta: ((9 12) 4 6 8)


Problema 2

Obtener una lista con las hojas impares en orden inverso:

Rpta: (7 9 1)

Problema 3

Obtener el resultado de la resta de la sumatoria de nú meros pares hojas menos


la sumatoria de nú meros mú ltiplos de 3: (Σ𝑁°𝑝𝑎𝑟𝑒𝑠 ℎ𝑜𝑗𝑎𝑠− Σ𝑁°𝑚𝑢𝑙𝑡𝑖𝑝𝑙𝑜𝑠 𝑑𝑒 3
ℎ𝑜𝑗𝑎𝑠)
Rpta: 3

También podría gustarte