Funciones Primitivas de Lisp

Índice

1 Ayuda on-line en common 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)

2 Debug

C-u C-M x nombre-funcion

3 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

4 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))

5 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)

6 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.

7 Lógicas

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

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

8 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)

9 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")

10 Manejo de listas

setq: Asigna valores a una lista

Ejemplo de uso: (setq amigos '(samer vicente 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 '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)

11 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

12 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))

13 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))

14 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
(setf (get 'fechas 'startyear) '2013)
(setf (get 'fechas 'startmonth) '06)
(setf (get 'fechas 'endyear) '2013)
(setf (get 'fechas 'endmonth) '12)

15 Arreglos

make-array: crea un arreglo en common lisp con la ayuda de setq

Ejemplo de uso (common lisp): (setq matriz-cl (make-array '(4 4)))
Ejemplo de uso (emacs lisp): (setq matriz-el '[[1 1 0 1] [0 1 0 1] [0 0 0 0] [0 1 0 0]])

aref: sirve para recuperar un valor del arreglo

Ejemplo de uso (common lisp): (setq (aref matriz-cl 0 0) 3)
Ejemplo de uso (emacs lisp): (aref (aref matriz-el 0) 0)

16 Estructuras

defstruct: define una estructura lisp

Ejemplo de uso: (defstruct q (key #'identity) (last nil) (elements nil))

17 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))

18 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 en common lisp

Ejemplo de uso: (time (+ 2 3))

benchmark: es la función en elisp que devuelve el coste computacional

Ejemplo de uso: (benchmark 4 (+ 2 3))

19 Port

getenv: nos devuelve el valor de una variable de entorno

Ejemplo de uso: (port:getenv "HOME")

20 Licencia

Autor: David Arroyo Menéndez

Created: 2014-07-05 sáb 09:33

Emacs 24.3.1 (Org mode beta_8.3)

Validate