Diferencia entre revisiones de «Lisp»
m Revertidos los cambios de 201.236.5.217 a la última edición de Xqbot |
|||
Línea 87: | Línea 87: | ||
((= m 3) (+ 5 (* 8 (- (expt 2 n) 1)))) |
((= m 3) (+ 5 (* 8 (- (expt 2 n) 1)))) |
||
(t (cond ((= n 0) (ackermann (- m 1) 1)) |
(t (cond ((= n 0) (ackermann (- m 1) 1)) |
||
(t (ackermann (- m 1) (ackermann m (- n |
(t (ackermann (- m 1) (ackermann m (- n 1)))))))) |
||
== Enlaces externos == |
== Enlaces externos == |
Revisión del 23:57 15 may 2009
Lisp | ||
---|---|---|
John McCarthy y Steve Russell | ||
Información general | ||
Paradigma | multiparadigma: orientado a objetos, funcional, declarativo | |
Apareció en | 1958 | |
Diseñado por | John McCarthy | |
Sistema de tipos | fuerte, dinámico | |
Implementaciones | múltiples | |
Dialectos | Common Lisp, Scheme, Emacs Lisp | |
Influido por | Information Processing Language | |
Ha influido a | Smalltalk, CLOS, Dylan, Perl | |
Lisp es el segundo lenguaje de programación más antiguo (después de Fortran) de alto nivel. Lisp es de tipo declarativo y fue creado en 1958 por John McCarthy y sus colaboradores en el MIT.
Listas
El elemento fundamental en Lisp es la lista, en el sentido más amplio del término, pues tanto los datos como los programas son listas. De ahí viene su nombre, pues Lisp es un acrónimo de "LIStProcessing".
Las listas en LISP están delimitadas por paréntesis. De aquí viene el chiste del significado de LISP: "LostInStupidParentheses" que aunque con buen humor es completamente ficticio.
Algunas de las funciones predefinidas de Lisp tienen símbolos familiares (+ para la suma, * para el producto), pero otras son más exóticas, especialmente dos que sirven precisamente para manipular listas, descomponiéndolas en sus componentes. Sus nombres ("car" y "cdr") son un poco extraños, reliquias de tiempos pasados y de la estructura de los ordenadores de segunda generación, "car" devuelve la cabeza de una lista y "cdr" su cola o resto.
Lisp sigue una filosofía de tratamiento no-destructivo de los parámetros, de modo que la mayoría de las funciones devuelven una lista resultado de efectuar alguna transformación sobre la que recibieron, pero sin alterar esta última.
Uno de los motivos por los que Lisp es especialmente adecuado para la IA es el hecho de que el código y los datos tengan el mismo tratamiento (como listas); esto hace especialmente sencillo escribir programas capaces de escribir otros programas según las circunstancias.
Lisp fue uno de los primeros lenguajes de programación en incluir manejo de excepciones con las primitivas catch y throw.
Derivado del Lisp es el lenguaje de programación Logo. Sin entrar en detalles, podría decirse que Logo es Lisp sin paréntesis y con operadores aritméticos infijos.
Orígenes de "car" y "cdr"
- car: Content of Address part of Register - cdr: Content of Decremental part of Register
Son operaciones del juego de instrucciones del IBM 704
Ejemplos
Hola mundo
(format t "¡Hola, mundo!")
Trabajando con listas
******************************************************************* Definición de la función: (defun vacia (l) (cond ((null l) 1) ; si la lista esta vacia devuelve 1 (t 0))) ; en otro caso (lista llena) devuelve 0 Llamada a la función: (vacia '(1 3 4)) ; La lista no esta vacia, devolvería 0 (vacia '()) ; La lista esta vacia, devolvería 1 ******************************************************************* (defun último (lista) (cond ((null (cdr lista)) (car lista)) (t (último (cdr lista))))) (último '(1 2 3 4 5 6 7)) ; devuelve el último de la lista: 7 ******************************************************************* ; ---FACTORIAL---- ;Definición matemática ; Factorial(x) = 1 si x=0 caso base ; x*factorial(x-1) si x>0 caso recursivo ;Función factorial hecha con recursividad no final (defun factorial (n) (if (= 0 n) 1 ; caso base (* n (factorial (- n 1))))) ; caso recursivo (factorial 4) ;esto nos devolvería 24=4*3*2*1 *******************************************************************
Grandes valores de la Función de Ackermann
;Propuesta por Nikolai Coica (defun ackermann (m n) "The Ackermann Function" (cond ((= m 0) (+ n 1)) ((= m 1) (+ n 2)) ((= m 2) (+ 3 (* n 2))) ((= m 3) (+ 5 (* 8 (- (expt 2 n) 1)))) (t (cond ((= n 0) (ackermann (- m 1) 1)) (t (ackermann (- m 1) (ackermann m (- n 1))))))))
Enlaces externos
- Wikilibros alberga un libro o manual sobre Programación en LISP.
- Features of Common Lisp Una discusión de algunas de las características más sobresalientes del lenguaje.
- Desarrollo de Software en LISP Comunidad virtual para el intercambio de información en castellano sobre desarrollo de software en LISP para profesionales practicantes, docentes y estudiantes.
- www.cliki.net CLiki, el wiki de common lisp
- Generar páginas dinámicamente con Lisp y Apache, artículo de Rober Morales
- La expansión decimal de A(4,2)
- Practical Common Lisp Libro introductorio de Common Lisp. Versión on-line y distribuible por la propia editorial.
Aplicaciones en Lisp
Entre las más exitosas aplicaciones escritas en Lisp se pueden mencionar:
- Emacs, el editor de texto http://www.gnu.org/software/emacs/emacs.html
- ACL2, el demostrador de teoremas http://www.cs.utexas.edu/users/moore/acl2/
- Maxima, el sistema de álgebra computacional http://maxima.sourceforge.net/
Compiladores de Lisp
- GNU Common Lisp, software libre
- Allegro Common Lisp, software propietario
- CMU Common Lisp, software libre
- CLISP, Una implementación de Common Lisp, software libre
- OpenMCL Common lisp para Macintosh, software libre
- Steel Bank Common Lisp, creado a partir de CMU Common Lisp, es un software libre con énfasis en proveer facilidades para su mantenimiento.