Programación en LISP
Prólogo
editarIntroducción
editarPara más información, véase el artículo «Lisp» en Wikipedia. |
Lisp es un lenguaje de programación usado en el mundo de la inteligencia artificial. A diferencia de otros lenguajes de programación, en Lisp, a pesar de ser un lenguaje con una cierta antigüedad, no es un lenguaje del que se disponga de mucha documentación, de hecho, casi toda la documentación disponible esta en inglés. Hago uso de este medio para poder traducir a mi idioma, el castellano.
Lisp se diferencia de otros lenguajes, en que la forma de entender la programación no es la clásica que todo el mundo suele manejar, es decir, la forma de programación es totalmente declarativa y no procedimental como en el caso de los famosos lenguajes de programación C ▶/C++ ▶, Java ▶, C# .NET ▶, ASP ▶, PHP ▶, etc.
Cuando se quiere implementar un problema en Lisp, éste se realiza escribiendo lo que se quiere conseguir y como, pero sin indicar paso a paso la secuencia de acciones que la computadora debe de realizar. Esta filosofía aunque parezca extraña, seguro que muchos programadores ya la han usado, ya que existen otros lenguajes declarativos como puedan ser el Prolog, Perl e incluso el mismo SQL. En estos lenguajes especificamos el qué queremos obtener sin preocuparnos del cómo.
Características del lenguaje LISP
editarEn su notación, las expresiones están expresadas de forma prefija, estando estas cerradas entre paréntesis.
>1 1 > (+ 2 3) 5 > (+ (- 5 2) (* 3 3)) 12 > (exit) Bye.
Declarar funciones (nuestras propias funciones)
editarAl igual que otros lenguajes de programación, en Lisp podemos declarar funciones definidas por el usuario para modularizar los programas y hacerlos más legibles en la medida de lo posible, reutilizando así código escrito y separando distintas partes del problema a representar en módulos.
Esto se consigue con la palabra clave defun.
(defun nombre-funcions (arg1 arg2 ... argn) “comentarios” (cuerpo ) )
(defun CUADRADO (x) "Mi funcion cuadrado" (* x x ) )
Palabras reservadas
editarcar
editarDevuelve el primer elemento de una lista (car lista)
- NOTA: En algunos sistemas operativos la palabra reservada car es sustituida por first**
> (CAR ‘(A B C D)) A
cdr
editarDevuelve la lista sin su primer elemento
- NOTA: En algunos sistemas operativos, cdr es sustituido por REST**
(cdr lista)
> (cdr ’(a b c)) (B C)
cond
editarLa palabra cond ejecuta un flujo de control dependiendo de la condición si es cierta o no. Es algo parecido al switch de C ▶/C++ ▶, Java ▶, C# .NET ▶, etc.. pero con la diferencia que en este caso lo que se pone en los case son condiciones lógicas y no constantes.
(cond ((condicion1) bloque1) ((condicio2) bloque2) ... ((condicionN) bloqueN) )
> (defun notas (n) (cond ((< n 5) "suspenso") ((< n 7) "aprobado") ((< n 9) "notable") ((= n 10) "sobresaliente"))) > (notas 8) "notable"
cons
editarAñade al principio de una lista dada un elemento
(cons elem lista)
> (cons ’a ’(b c d)) (A B C D)
defun
editarDefine una función con un nombre el cual será llamado mediante el comando (nombre-funcion args) y que tiene como argumentos una lista de variables. El cuerpo es una lista que define qué hace la función y es ésta la que ejecuta la acción.
Esto se consigue con la palabra clave defun.
(defun nombre-funcions (arg1 arg2 ... argn) “comentarios” (cuerpo ) )
(defun CUADRADO (x) "Mi funcion cuadrado" (* x x ) )
endp
editarCierto (T, de true) si la lista está vacía, y nil (sin valor) en caso contrario
(endp '(a b c)) >nil
(endp '()) >T
eq
editarSe utiliza eq para saber si dos átomos son iguales, independientemente de la referencia.
Sintaxis (eq X Y)
(eq 3 3) => T (eq 3 3.0) => NIL (eq 3.0 3.0) => NIL (eq (first ’(a b c)) ’a) => T (eq (cons ’a ’(b c)) ’(a b c)) => NIL
equal
editarEs utilizado equal para saber si dos listas son iguales, independientemente de la referencia.
(equal (cons ’a ’(b)) (cons ’a ’(b))) => T
list
editarConstruye una lista a partir de sus elementos
(list elem1 elem2 elem3 .. elemN)
> (list ’a (+ 1 2) nil) (A 3 NIL)
quote
editarLa función quote evita la evaluación de su argumento.
> (quote (+ (- 5 2) (* 3 3))) (+ (- 5 2) (* 3 3))
Enlaces Externos
editar- Lo que hizo diferente a Lisp Ensayo de Paul Graham donde expone las principales características del lenguaje.