An open API service indexing awesome lists of open source software.

https://github.com/davidam/davidam

Personal elisp functions
https://github.com/davidam/davidam

Last synced: 6 months ago
JSON representation

Personal elisp functions

Awesome Lists containing this project

README

          

#+TITLE: Funciones Primitivas de Lisp
#+LANGUAGE: es
#+AUTHOR: David Arroyo Menéndez
#+HTML_HEAD:
#+BABEL: :results output :session

* Ayuda on-line en lisp

Para emacs lisp, basta con C-h f.

En common lisp hay unas cuantas primitivas de lisp, para 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)

* Debug
C-u C-M x nombre-funcion
* 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
setq: Asiga valores a una variable
#+BEGIN_SRC lisp
Ejemplo de uso: (setq nueve '9)
(setq l '(a b c))
#+END_SRC

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
#+BEGIN_SRC lisp
Ejemplo de uso: (setq nueve '9)
(let ((nueve 'interior)
(y nueve))
(list nueve y))
#+END_SRC
#+BEGIN_SRC lisp
Ejemplo de uso: (setq nueve '9)
(let* ((nueve 'interior)
(y nueve))
(list nueve y))
#+END_SRC

* Aritméticas
+, -, *, / : Son las operaciones para sumar, restar, multiplicar y dividir
#+BEGIN_SRC lisp
Un ejemplo de uso es: (+ (* 2 3) 5)
#+END_SRC

% : 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.
#+BEGIN_SRC lisp
Un ejemplo de uso es: (1+ 9)
#+END_SRC

max, min : Devuelve el valor máximo de una lista
#+BEGIN_SRC lisp
Un ejemplo de uso es: (max 23 4 5 234 654)
#+END_SRC

float: Devuelve el valor en coma flotante
#+BEGIN_SRC lisp
Ejemplo de uso: (float (/ 22 7))
#+END_SRC

round: redondea un valor al entero más cercano
#+BEGIN_SRC lisp
Ejemplo de uso: (round (/ 22 7))
#+END_SRC

expt: calcula potencias elevando su primer argumento a su segundo
#+BEGIN_SRC lisp
Ejemplo de uso: (expt 2 3)
#+END_SRC

sqrt: calcula raices cuadradas
#+BEGIN_SRC lisp
Ejemplo de uso: (sqrt 9)
#+END_SRC

abs: calcula el valor absoluto
#+BEGIN_SRC lisp
Ejemplo de uso: (abs -3)
#+END_SRC

random: calcular un número aleatorio de 0 a N-1
#+BEGIN_SRC lisp
Ejemplo de uso: (random '5)
#+END_SRC

* Comparación
>, <, >=, <= : Mayor que, Menor que, Mayor o igual que, Menor o igual que. Sólo números
#+BEGIN_SRC lisp
Un ejemplo de uso: (< (max 5 6) 6)
#+END_SRC

/= : Distinto que. Sólo para números
#+BEGIN_SRC lisp
Ejemplo de uso: (/= 5 4)
#+END_SRC

equal: Evalúa si el valor de los dos argumentos es la misma expresión
#+BEGIN_SRC lisp
Ejemplo de uso: (equal (+ 2 2) 4)
#+END_SRC

eql: Evalúa si el valor de los dos argumentos es el mismo símbolo o número.
#+BEGIN_SRC lisp
Ejemplo: Fallará si intentamos (eql '(x y) '(x y))
#+END_SRC

eq: Evalúa si el valor de los dos argumentos es el mismo símbolo.
#+BEGIN_SRC lisp
Ejemplo: Fallará si intentamos (eq '(x y) '(x y))
#+END_SRC

= : Evalúa si el valor de los dos argumentos es el mismo número.
#+BEGIN_SRC lisp
Ejemplo: Falla si intentamos ver si (= 'x 'x)
#+END_SRC

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.
#+BEGIN_SRC lisp Ejemplos de uso:
(setq 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)))
#+END_SRC

sort: ordena una lista en el orden que se le dicta como argumento
#+BEGIN_SRC lisp
Ejemplo de uso: (sort '(3 1 4 1 5 9) #'<)
Al igual que nconc y delete sort altera el contenido de la lista.
#+END_SRC

* Lógicas
and, or y not: Son las expresiones lógicas de toda la vida
#+BEGIN_SRC lisp
Ejemplo de uso: (and (< 5 6) T)
#+END_SRC

* Manejo de Secuencias (son tanto listas como cadenas)

elt: devuelve el elemento que ocupa la posición x de la secuencia.
#+BEGIN_SRC lisp
Ejemplo de uso: (elt '(a b c) 0)
#+END_SRC
length: cuenta el número de elementos de nivel superior que hay en una lista.
#+BEGIN_SRC lisp
Ejemplo de uso: (length '(platon socrates aristóteles))
#+END_SRC
reverse: invierte el orden de los elementos de nivel superior de la secuencia.
#+BEGIN_SRC lisp
Ejemplo de uso: (reverse '(platon socrates aristóteles))
#+END_SRC
replace: reemplaza los elementos de la seq1 con los elementos de seq2. seq1 se modifica de manera destructiva
#+BEGIN_SRC lisp
Ejemplo de uso:
(defvar sent '(1 2 3 4 5 6 7 8 9 0))
(replace sent '("Second" "Third") :start1 1 :end1 9)
#+END_SRC

#+BEGIN_SRC lisp
Ejemplo de uso:
(defvar from '(1 2 3))
(defvar to '(a b c))
(replace from to :start1 1 :end1 2)
#+END_SRC

* 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.
#+BEGIN_SRC lisp
Ejemplo de uso: (string= "abc" "ABC")
#+END_SRC
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.
#+BEGIN_SRC lisp
Ejemplo de uso: (char= #\a #\a)
#+END_SRC
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.
#+BEGIN_SRC lisp
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.
#+END_SRC
concatenate: concatena cadenas
#+BEGIN_SRC lisp
Ejemplo de uso: (concatenate 'string "hola" "adios")
#+END_SRC

* Manejo de listas
setq: Asigna valores a una lista
#+BEGIN_SRC lisp
Ejemplo de uso: (setq amigos '(jesus gema gregorio))
#+END_SRC
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
#+BEGIN_SRC lisp
Ejemplo de uso: (first amigos)
#+END_SRC
rest: Devuelve la lista sin el primer elemento. Es lo mismo que cdr
#+BEGIN_SRC lisp
Ejemplo de uso: (rest amigos)
#+END_SRC
cadr: Entre c y r puede haber una combinación a y d que denotan el encadenamiento de first y rest.
#+BEGIN_SRC lisp
Ejemplo de uso: (caddr amigos) = (first (rest (rest amigos)))
#+END_SRC
second, third, fourth,...: Devuelve el segundo, tercer, o cuarto elemento de una lista (hay hasta el tenth)
#+BEGIN_SRC lisp
Ejemplo de uso: (third amigos)
#+END_SRC
cons: Inserta un nuevo elemento en la primera posición de una lista.
#+BEGIN_SRC lisp
Ejemplo de uso: (cons 'lucas amigos)
;; Lo que realmente hace cons es hacer que el primer apuntador de la lista sea 'lucas.
#+END_SRC
append: Combina dos listas en una
#+BEGIN_SRC lisp
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).
#+END_SRC

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.
#+BEGIN_SRC lisp
Ejemplo de uso: (nconc amigos '(b c))
;; Si ahora llamamos a amigos desde clisp el resultado no es el que tal vez esperábamos.
#+END_SRC

list: Elabora una lista con sus argumentos
#+BEGIN_SRC lisp
Ejemplo de uso: (list '1 '2 '3)
#+END_SRC

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.
#+BEGIN_SRC lisp
Ejemplo de uso: (pop amigos)
#+END_SRC

nthcdr: elimina los n primeros elementos de una lista
#+BEGIN_SRC lisp
Ejemplo de uso: (nthcdr 3 amigos)
#+END_SRC

butlast: elimina los n últimos elementos de una lista
#+BEGIN_SRC lisp
Ejemplo de uso: (butlast amigos 2)
#+END_SRC

last: devuelve una lista en la que se han eliminado todos los elementos menos el último.
#+BEGIN_SRC lisp
Ejemplo de uso: (last amigos)
#+END_SRC

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.
#+BEGIN_SRC lisp
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)
#+END_SRC

member: comprueba si un elemento pertenece a una lista y devuelve una lista con los elementos que hay desde el elemento coincidente
#+BEGIN_SRC lisp
Ejemplo de uso: (member 'c '(b c a))
#+END_SRC

delete: se deshace de las ocurrencias del primer argumento que aparezcan en el nivel superior del segundo.
#+BEGIN_SRC lisp
Ejemplo de uso: (delete 'jorge amigos)
Nótese que delete ha borrado del todo a jorge de amigos.
#+END_SRC

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.
#+BEGIN_SRC lisp
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)
#+END_SRC

* 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.
#+BEGIN_SRC lisp
Ejemplo de uso: (mapcar #'oddp '(1 2 3))
(mapcar #'- '(1 2 3 4))
#+END_SRC

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.
#+BEGIN_SRC lisp
Ejemplo de uso: (remove-if #'evenp '(1 2 3 4))
#+END_SRC

reduce: Similar a mapcar, simplifica operaciones de filtrado de secuencias.
#+BEGIN_SRC bash
Ejemplo de uso:
(reduce (lambda (best item)
(if (and (oddp item) (> item best))
item
best))
'(1 4 6 5 8 2 7))
#+END_SRC

count-if, find-if: Simplifican las operaciones de conteo y localización.
#+BEGIN_SRC lisp
Ejemplo de uso: (count-if #'evenp '(1 2 3 4))
(find-if #'evenp '(1 2 3 4))
#+END_SRC

funcall: Permite definir procedimientos que tengan procedimientos como argumentos.
#+BEGIN_SRC lisp
Ejemplo de uso: (funcall #'first '(1 2 3))
#+END_SRC

apply: usa el valor de su primer argumento sobre los elementos de su segundo argumento, el cual debe ser una lista.
#+BEGIN_SRC lisp
Ejemplo de uso: (apply #'append '((e1 e2) (e3 e4)))
(apply #'+ 1 2 3 '(4 5 6))
#+END_SRC

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.
#+BEGIN_SRC lisp
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
#+END_SRC

* Iteración sobre números y listas
DOTIMES:
(dotimes ( )
)
#+BEGIN_SRC lisp
Ejemplo de uso:
(dotimes (i (length '(2 3 4 5)))
(if (= 5 (elt '(2 3 4 5) i))
(print "encontrado 5")))
#+END_SRC

DOLIST:
(dolist ( )
)
#+BEGIN_SRC lisp
Ejemplo de uso:
(dolist (i '(2 3 5 6))
(if (equal 5 i) (format t "encontrado ~a" i)))
#+END_SRC

DO: es mas general que dolist y dotimes
#+BEGIN_SRC lisp
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))))
#+END_SRC

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

PROG1 y PROGN: ambos interpretan secuencias, progn devuelve el resultado de la n-ésima función y prog1 de la primera.
#+BEGIN_SRC lisp
Ejemplo de uso: (progn (setq a 'x) (setq b 'y) (setq c 'z))
#+END_SRC

* Funciones de Lectura y Escritura
print, format: son operaciones de salida de texto.
#+BEGIN_SRC lisp
Ejemplo de uso: (format t "~%¡Hola!~%Estoy listo para empezar.")
#+END_SRC

read: es una operación de lectura de texto.
#+BEGIN_SRC lisp
Ejemplo de uso: (setq dato-usuario (read))
#+END_SRC

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.
#+BEGIN_SRC lisp
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)))
#+END_SRC

read-char: lee un carácter
#+BEGIN_SRC lisp
Ejemplo de uso: (read-char)
#+END_SRC

with-open-file: permite leer y escribir en archivos
plantilla:
(with-open-file (
<"ruta del archivo">
:direction <:input o :output>)
...)
#+BEGIN_SRC lisp
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))))
#+END_SRC

open: permite escribir en archivos
#+BEGIN_SRC lisp
Ejemplo de uso: (defvar *st-local* (open "/tmp/local1" :direction :output :if-exists :rename-and-delete))
#+END_SRC

eval: es una operación que lee y evalúa.
#+BEGIN_SRC lisp
Ejemplo de uso: (eval (read))
#+END_SRC

* Propiedades

get: establece (con setf) y recupera el valor de una propiedad de un símbolo.
#+BEGIN_SRC lisp
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)
#+END_SRC

* Arreglos

make-array: crea un arreglo en common lisp con la ayuda de setq
#+BEGIN_SRC lisp
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]])
#+END_SRC

aref: sirve para recuperar un valor del arreglo
#+BEGIN_SRC lisp
Ejemplo de uso (common lisp): (setq (aref matriz-cl 0 0) 3)
Ejemplo de uso (emacs lisp): (aref (aref matriz-el 0) 0)
#+END_SRC

* Estructuras

defstruct: define una estructura lisp
#+BEGIN_SRC lisp
Ejemplo de uso: (defstruct q (key #'identity) (last nil) (elements nil))
#+END_SRC

* Funciones y Macros
defun: crea funciones
#+BEGIN_SRC lisp
Ejemplo de uso: (defun square (x) (* x x))
#+END_SRC

defmacro: crea macros
#+BEGIN_SRC lisp
Ejemplo de uso: (defmacro square (X) `(* ,X ,X))
Ejemplo de uso: (defmacro square2 (X) `(let ((Temp ,X)) (* Temp Temp)))
#+END_SRC

macroexpand-1: devuelve la forma lisp del macro con sus argumentos
#+BEGIN_SRC lisp
Ejemplo de uso: (macroexpand-1 '(square 9))
#+END_SRC

* Entorno

get-universal-time: nos devuelve la fecha actual en formato unix
#+BEGIN_SRC lisp
Ejemplo de uso: (get-universal-time)
#+END_SRC

machine-type: nos devuelve la familia de maquina que usamos
#+BEGIN_SRC lisp
Ejemplo de uso: (machine-type)
#+END_SRC

time: nos devuelve el coste computacional en common lisp
#+BEGIN_SRC lisp
Ejemplo de uso: (time (+ 2 3))
#+END_SRC

benchmark: es la función en elisp que devuelve el coste computacional
#+BEGIN_SRC lisp
Ejemplo de uso: (benchmark 4 (+ 2 3))
#+END_SRC

* Port

getenv: nos devuelve el valor de una variable de entorno
#+BEGIN_SRC lisp
Ejemplo de uso: (port:getenv "HOME")
#+END_SRC

* Licencia
Este documento está bajo una [[http://creativecommons.org/licenses/by/3.0/deed][Licencia Creative Commons Reconocimiento Unported 3.0]]

[[file:http://i.creativecommons.org/l/by/3.0/88x31.png]]