Nota: Este documento es libre puedes copiarlo y modificarlo siempre y cuando mantegas esta nota.
= FUNCIONES PRIMITIVAS DE LISP =
== Ayuda on-line en lisp ==
Esto es un resumen con ejemplo de unas cuantas primitivas de lisp, por lo que en ocasiones será necesario ir a la ayuda
describe: es útil si quieres saber qué argumentos tiene una función, ó a qué paquete corresponde
Ejemplo de uso: (describe 'first)
apropos: lista el conjunto de símbolos relativos al argumento del que queremos información.
Ejemplo de uso: (apropos 'first)
== Moviéndonos con emacs ==
Esc-x lisp-mode: entramos en el modo lisp
Ctl+Alt+n: vas al siguiente parentesis
Ctl+Alt+p: vas al anterior parentesis
Ctl+Alt+d: te introduces en la siguiente funcion
Ctl+Alt+u: te sales de la funcion actual
Ctl+Alt+t: intercambia la funcion anterior a la posicion de la actual
Esc+Ctl+k: borra el argumento de la funcion
== Asignación ==
setf: Asiga valores a una variable
Ejemplo de uso: (setf nueve '9)
(setf 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: (setf nueve '9)
(let ((nueve 'interior)
(y nueve))
(list nueve y))
Ejemplo de uso: (setf nueve '9)
(let* ((nueve 'interior)
(y nueve))
(list nueve y))
== 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)
== 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.
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.
Ejemplos de uso:
(setf dia-o-fecha 'lunes)
(if (symbolp dia-o-fecha) 'dia 'fecha)
(when (symbolp dia-o-fecha) 'dia)
(cond ((symbolp dia-o-fecha) 'dia)
((numberp dia-o-fecha) 'fecha))
(case figura
(circulo (* pi r r))
(esfera (* 4 pi r r)))
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.
== Lógicas ==
and, or y not: Son las expresiones lógicas de toda la vida
Ejemplo de uso: (and (< 5 6) T)
== 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))
=== 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")
=== Manejo de listas ===
setf: Asigna valores a una lista
Ejemplo de uso: (setf amigos '(ines elisa jorge luismi))
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 'edu amigos)
Lo que realmente hace cons es hacer que el primer apuntador de la lista sea 'edu.
append: Combina dos listas en una
Ejemplo de uso: (setf 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: (setf sara '((estatura 1.7) (peso 65)))
(assoc 'peso sara)
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)
== 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))
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)) -> haz la macro memberp
Ejemplo de uso: ((lambda (x) (list x x)) '(lambda (x) (list x x))) -> programa q se escribe a si mismo
== Iteración sobre números y listas ==
DOTIMES:
(dotimes (<contador> <límite-superior> <resultado>)
<cuerpo del bucle>)
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))
(setf resultado (* m resultado)) ;;cuerpo del bucle
(setf 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 (setf a 'x) (setf b 'y) (setf c 'z))
== 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: (setf 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))
== Propiedades ==
get: establece (con setf) y recupera el valor de una propiedad de un símbolo.
Ejemplo de uso: (setf (get 'luis 'padres) '(alfonso monica)) ;; establece
(get 'luis 'padres) ;; recupera
== Arreglos ==
make-array: crea un arreglo con la ayuda de setf
Ejemplo de uso: (setf matriz (make-array '(4 4)))
aref: sirve para recuperar un valor del arreglo
Ejemplo de uso: (setf (aref matriz 0 0) 3)
== Funciones y Macros ==
defun: crea funciones
Ejemplo de uso: (defun square (x) (* x x))
defmacro: crea macros
Ejemplo de uso: (defmacro square (X) `(* ,X ,X))
Ejemplo de uso: (defmacro square2 (X) `(let ((Temp ,X)) (* Temp Temp)))
macroexpand-1: devuelve la forma lisp del macro con sus argumentos
Ejemplo de uso: (macroexpand-1 '(square 9))
== Entorno ==
get-universal-time: nos devuelve la fecha actual en formato unix
Ejemplo de uso: (get-universal-time)
machine-type: nos devuelve la familia de maquina que usamos
Ejemplo de uso: (machine-type)
time: nos devuelve el coste computacional de una funcion
Ejemplo de uso: (time (+ 2 3))
== Port ==
getenv: nos devuelve el valor de una variable de entorno
Ejemplo de uso: (port:getenv "HOME")