Você está na página 1de 15

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 funcin, a qu paquete corresponde
Ejemplo de uso: (describe 'first)
apropos: lista el conjunto de smbolos relativos al argumento del que queremos informacin. Ejemplo
de uso: (apropos 'first)

2 Debug
C-u C-M x nombre-funcion

3 Movindonos 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 Asignacin
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 Aritmticas
+, -, *, / : Son las operaciones para sumar, restar, multiplicar y dividir

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

% : Esta no funciona en clisp, vena en el libro de emacs


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

Un ejemplo de uso es: (1+ 9)

max, min : Devuelve el valor mximo 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 ms 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 nmero aleatorio de 0 a N-1

Ejemplo de uso: (random '5)

6 Comparacin
>, <, >=, <= : Mayor que, Menor que, Mayor o igual que, Menor o igual que. Slo nmeros

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

/= : Distinto que. Slo para nmeros

Ejemplo de uso: (/= 5 4)

equal: Evala si el valor de los dos argumentos es la misma expresin

Ejemplo de uso:

(equal (+ 2 2) 4)

eql: Evala si el valor de los dos argumentos es el mismo smbolo o nmero.

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

eq: Evala si el valor de los dos argumentos es el mismo smbolo.

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

= : Evala si el valor de los dos argumentos es el mismo nmero.

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

zerop: Evala si un nmero es cero.


plusp: Evala si un nmero es positivo.
listp: Evala si el argumento es una lista.
evenp: Evala si un nmero es par.
oddp: Evala si un nmero es impar.
numberp: Evala si es un nmero.
symbolp: Evala si es un smbolo.
if, when, unless y case: Sirven para ejecutar o no acciones si se cumple una condicin.

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 Lgicas
and, or y not: Son las expresiones lgicas 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 posicin x de la secuencia.

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

length: cuenta el nmero de elementos de nivel superior que hay en una lista.

Ejemplo de uso: (length '(platon socrates aristteles))

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

Ejemplo de uso: (reverse '(platon socrates aristteles))

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 minsculas y maysculas 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 minsculas y maysculas 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
posicin donde empieza la correspondencia, en otro caso devuelve NIL.

Ejemplo de uso: (search "Mrquez" "Garca Mrquez")


Ejemplo de uso: (search "MRQUEZ" "Garca Mrquez" :test #'char-equal) ;; as se evita
que distinga entre maysculas y minsculas.

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 vaca
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 combinacin 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 posicin 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

esperbamos.

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. Fjate 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 asociacin. Una lista de asociacin 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)


Ntese 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 prctica 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 transformacin de listas. Se proporciona el procedimiento de
transformacin 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 filtracin 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 localizacin.

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 annimos, es un defun sin nombre del procedimiento, til para dejar
ms 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 funcin
Ejemplo de uso: ((lambda (x) (list x x)) '(lambda (x) (list x x))) -> programa q se
escribe a si mismo

12 Iteracin sobre nmeros y listas


DOTIMES: (dotimes (<contador> <lmite-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 parmetros

(exponente n))
(when (zerop exponente)

;;condicin de terminacin

(return resultado))
(setq resultado (* m resultado))

;;cuerpo del bucle

(setq exponente (- exponente 1))))

LOOP: Slo se detiene al encontrarse con un return (loop <cuerpo>)


PROG1 y PROGN: ambos interpretan secuencias, progn devuelve el resultado de la n-sima funcin 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 operacin 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 lnea, 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 carcter

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

"~%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 operacin que lee y evala.

Ejemplo de uso: (eval (read))

14 Propiedades
get: establece (con setf) y recupera el valor de una propiedad de un smbolo.

Ejemplo de uso: (setf (get 'luis 'padres) '(alfonso monica)) ;; establece


(get 'luis 'padres)
(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

;; recupera

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 funcin 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

Você também pode gostar