Lisp

**Lisp** (históricamente **LISP**) ye una familia de llinguaxes de programación d'ordenador de tipu multiparadigma con llarga historia y una inconfundible y útil sintaxis basada na notación polaca.

Desenvueltu orixinalmente en 1958 por John McCarthy y los sos collaboradores nel Institutu Teunolóxicu de Massachusetts, Lisp ye'l segundu llinguaxe de programación d'altu nivel de mayor antigüedá ente los que siguen teniendo un usu estendíu na actualidá; namái FORTRAN ye anterior.

Al igual que'l FORTRAN, Lisp camudó enforma dende los sos empiezos, y esistieron un gran númberu de dialeutos na so hestoria. Güei, los dialeutos Lisp de propósitu xeneral más llargamente conocíos son Common Lisp y Scheme.

Lisp foi creáu orixinalmente como una notación matemática práutica pa los programes d'ordenador, basada nel cálculo lambda d'Alonzo Church. Convirtióse rápido nel llinguaxe de programación favoritu na investigación de la intelixencia artificial (AI). Como llinguaxes de programación precursor, Lisp foi pioneru en munches idees en ciencies de la computación, incluyendo les estructures de datos d'árbol, el remano d'almacenamientu automáticu, tipo dinámicos, y el compilador autu conteníu.

El acrónimu LISP significa "**LIS**t **P**rocessor" (Procesamientu de llistes). Les llistes encadenaes son una de les estructures de datos importantes de Lisp, y el códigu fuente de Lisp en sí mesmu ta compuestu de llistes. Como resultancia, los programes de Lisp pueden manipoliar el códigu fonte como una estructura de datos, dando llugar a los macro sistemes que dexen a los programadores crear llinguaxes de dominiu específicu enfiñíos en Lisp.

La intercambiabilidad del códigu y los datos tamién da a Lisp el so instantáneamente reconocible sintaxis. Tol códigu del programa ye escritu como espresiones S, o llistes ente paréntesis. Una llamada de función o una forma sintáctica ye escrita como una llista, cola función o'l nome del operador de primeres, y los argumentos de siguío; por casu, una función f que toma tres argumentos puede ser llamada usando `(f x y z)`.

## Historia

Lisp foi inventáu por John McCarthy en 1958 mientres taba nel Institutu Teunolóxicu de Massachusetts (MIT). McCarthy publicó'l so diseñu en 1960 nun artículu de Communications of the ACM tituláu "Funciones recursivas d'espresiones simbóliques y el so cómputu a máquina, Parte I" (la "parte II" nunca foi publicada). Ellí amosó que con dellos operadores simples y una notación pa les funciones, unu puede construyir un llinguaxe Turing completu pa procesamientu d'algoritmos.

Dende 1955 ó 1956, el Information Processing Language foi'l primer llinguaxe de AI, y yá incluyera munchos de los conceutos, tales como procesu per llista y recursión, que vinieron ser usaos en Lisp.

La notación orixinal de McCarthy usaba "espresiones M" en corchetes que seríen traducíes a espresiones S. Como un exemplu, la espresión M car[cons[A,B]] ye equivalente a la espresión S `(car (cons A B))`. Una vegada que Lisp foi implementáu, el programadores rápido escoyeron usar espresiones S, y les espresiones M fueron abandonaes. les espresiones M remanecieron otra vegada colos intentos efímeros del MLISP de Horace Enea y el CGOL de Vaughan Pratt.

Lisp foi implementáu primero por Steve Russel nun ordenador IBM 704. Russell lleera l'artículu de McCarthy, y diose cuenta (pa la sorpresa de McCarthy) que la función *eval* de Lisp podía ser implementada en códigu de máquina. La resultancia foi un intérprete de Lisp funcional que podía ser usáu pa correr programes Lisp, o más correutamente, "evaluar espresiones Lisp".

Dos rutines de llinguaxe ensamblador pal IBM 704 convertir nes operaciones primitives pa descomponer llistes: car (conteníu del rexistru de direición) y cdr (conteníu del rexistru del decremento). Los dialeutos de Lisp inda usen el car y cdr ( y ) pa les operaciones que retornen el primer elementu y el restu de la llista respeutivamente.

El primer compilador completu de Lisp, escritu en Lisp, foi implementáu en 1962 por Tim Hart y Mike Levin nel MIT. Esti compilador introdució'l modelu Lisp de compilación incremental, nel cual les funciones compiladas ya interpretaes pueden entemecese llibremente. El llinguaxe nos avantos de Hart y Levin ye muncho más cercanu al estilu modernu de Lisp que l'anterior códigu de McCarthy.

### Xenealoxía y variantes

Sobre la so hestoria de cincuenta años, Lisp produció munches variaciones na tema base d'un llinguaxe d'espresión S. Per otra parte, cada dialeutu dau puede tener delles implementaciones, por casu, hai más d'una docena de implementaciones del Common Lisp.

Les diferencies ente los dialeutos pueden ser bien visibles, por casu, el Common Lisp y el Scheme usen distintes pallabres clave pa definir funciones. Dientro d'un dialeutu que ta estandarizado, sicasí, les implementaciones conformaes soporten el mesmu llinguaxe base, pero con distintes estensiones y biblioteques.

### Rellación cola intelixencia artificial

Dende'l so entamu, Lisp taba estrechamente rellacionáu cola comunidá d'investigación de la intelixencia artificial, especialmente en sistemes PDP-10. Foi usáu como la implementación del llinguaxe de programación Micro Planner que foi la fundación pal famosu sistema de AI SHRDLU. Nos años 1970, a midida que la investigación del AI nició descendientes comerciales, el desempeñu de los sistemes Lisp esistentes convertir nun problema creciente.

Lisp yera un sistema difícil d'implementar coles téuniques de compilador y hardware común de los años 1970. Les rutines de recoyida de basura, desenvueltes pol entós estudiante graduáu del MIT, Daniel Edwards, fixeron práuticu correr Lisp en sistemes de computación de propósitu xeneral, pero la eficacia inda siguía siendo un problema. Esto llevó a la creación de les máquines Lisp: hardware dedicáu pa correr ambientes y programes Lisp. Meyores tantu nel hardware d'ordenador como na teunoloxía de compiladores llueu fixeron obsoletas a les máquines de Lisp, en desterciu del mercáu de Lisp.

Mientres los años 1980 y 1990, foi fechu un gran esfuerciu pa unificar los numberosos dialeutos de Lisp nun solu llinguaxe (más notablemente, InterLisp, Maclisp, ZetaLisp, MetaLisp, y Franz Lisp). El nuevu llinguaxe, Common Lisp, foi esencialmente un subconxuntu compatible de los dialeutos que reemplazó. En 1994, l'ANSI publicó l'estándar del Common Lisp, "ANSI X3.226-1994 Information Technology Programming Language Common Lisp". Naquel momentu'l mercáu mundial pa Lisp yera muncho más pequeñu de lo que ye güei.

### Dende l'añu 2000

Tornando daqué nos años 1990, Lisp esperimentó una nueva crecedera d'interés. La mayor parte de la nueva actividá ta enfocada alredor de les implementaciones de fonte abierta del Common Lisp, ya inclúi el desenvolvimientu aplicaciones y de nueves biblioteques portátiles. Esti interés puede ser midíu en parte poles ventes de la versión impresa de Practical Common Lisp (Common Lisp Práuticu) de Peter Seibel, un tutorial pa nuevos programadores Lisp publicáu en 2004, que tuvo de volao en Amazon.com como'l segundu llibru de programación más popular. El llibru ye accesible en llinia ensin costu.

Munchos nuevos programadores Lisp fueron inspiraos por escritores como Paul Graham y Eric S. Raymond lluchando por un llinguaxe qu'otros consideren anticuáu. Los nuevos programadores de Lisp frecuentemente describen el llinguaxe como una esperiencia qu'abre los güeyos y una aclamación de ser substancialmente más granible qu'otros llinguaxes. Esti aumentu de conciencia puede ser oldeáu col "iviernu de la intelixencia artificial" y la curtia crecedera de Lisp a mediaos de los 1990.

Na so encuesta de les implementaciones del Common Lisp, Dan Weinreb llista once implementaciones viviegamente calteníes. Scieneer Common Lisp ye una nueva implementación comercial qu'encrució (fork) del CMUCL con un primer llanzamientu en 2002.

La comunidá del códigu llibre creó la nueva infraestructura de soporte: Cliki ye una Wiki que recueye la información rellacionada con Common Lisp, el Common Lisp directory llista recursos, el #lisp ye una canal popular d'IRC (con soporte por un Bot escritu en Lisp), lisppaste  soporta la distribución y l'intercambiu y comentariu de retazos de códigu (snippets), el Planet Lisp recueye'l conteníu de dellos blogues rellacionaos con Lisp, nel LispForum  l'usuariu alderica tópicos sobre Lisp, Lispjobs ye un serviciu p'anunciar ufiertes de trabayu y hai un nuevu serviciu de noticies selmanales (Weekly Lisp News).

Fueron celebraos los 50 años del Lisp (1958-2008) en LISP50@OOPSLA. Hai delles xuntes d'usuariu locales regulares (Boston, Vancouver, Hamburg,…), Xuntes Lisp (European Common Lisp Meeting, European Lisp Symposium) y una International Lisp Conference.

La comunidá Scheme caltién viviegamente más de venti implementaciones. Desenvolviéronse nos últimos años delles significatives nueves implementaciones (Chicken, Gauche, Ikarus, Larceny, Ypsilon). L'estándar de Scheme Revised⁵ Report on the Algorithmic Language Scheme foi llargamente aceptáu na comunidá del Scheme. El procesu Scheme Requests for Implementation creó munches biblioteques y estensiones casi estándares pal Scheme. Les comunidaes d'usuariu de implementaciones individuales del Scheme siguen creciendo. En 2003 un nuevu procesu d'estandarización del llinguaxe foi empezada y condució al estándar R⁶RS del Scheme en 2007. L'usu académicu del Scheme pa enseñar ciencies de la computación paez tornar daqué. Delles universidaes yá nun tán usando Scheme nos sos cursos preliminares de ciencies de la computación.

Hai tamién dellos nuevos dialeutos Lisp. Notablemente: Newlisp (un llinguaxe de scripting), Arc (desenvueltu por Paul Graham) y apocayá Clojure (desenvueltu por Rich Hickey) y NU pa la programación con Cocoa d'Apple.

## Dialeutos importantes

Los dos principales dialeutos de Lisp usaos pa la programación de propósitos xenerales anguaño son Common Lisp y Scheme. Estos llinguaxes representen opciones de diseñu significativamente distintos.

El Common Lisp, descendiente principalmente de MacLisp, Interlisp, y Lisp Machine Lisp, ye un superconjunto ampliáu de los primeros dialeutos del Lisp, con un estándar de llinguaxe grande incluyendo munchos tipos de datos y formes sintáctiques incorporaos, según un sistema del oxetu. El Scheme ye un diseñu más minimalista, con un muncho más pequeñu conxuntu de carauterístiques estándar pero con ciertes carauterístiques de implementación (tales como optimización de llamada de cola y continuación completa) non atopaes necesariamente en Common Lisp. El Common Lisp tamién tomó emprestaes ciertes carauterístiques de Scheme tales como ámbitu de léxicu y clausura léxica.

El Scheme, ye un dialeutu del llinguaxe Lisp con ámbitu estáticu y cola recursiva auténtica inventáu por Guy Lewis Steele Jr. y Gerald Jay Sussman. Foi diseñáu pa tener una semántica escepcionalmente clara y simple y poques maneres distintes de formar espresiones. Una amplia variedá de paradigmes programaos atopen una espresión conveniente en Scheme, incluyendo los estilos imperativu, funcional, y pasu de mensaxes. El Scheme sigue evolucionando con una serie de los estándares (Revisedn Report on the Algorithmic Language Scheme) y una serie de Scheme Requests for Implementation.

Amás, los dialeutos de Lisp son usaos como llinguaxes de scripting nun númberu d'aplicaciones, colos más conocíos siendo'l Emacs Lisp nel editor d'Emacs, Visual Lisp en AutoCAD, Nyquist en Audacity.

## Innovaciones del llinguaxe

Lisp foi'l primer llinguaxe de programación homoicónico: la representación primaria del códigu del programa ye'l mesmu tipu d'estructura de la llista que tamién ye usada pa les principales estructures de datos. Como resultancia, les funciones de Lisp pueden ser manipoliaes, alteriaes o entá creaes dientro d'un programa Lisp ensin un estensivu analís sintácticu (parsing) o manipulación de códigu de máquina binariu. Esto xeneralmente ye consideráu una de les ventayes primaries del llinguaxe con al respective del so poder espresivu, y fai al llinguaxe favorable a la evaluación metacircular.

La ubicua estructura `IF THEN ELSE`, agora almitida como un elementu esencial de cualquier llinguaxe de programación, foi inventada por McCarthy pal usu en Lisp, onde vio la so primer apariencia nuna forma más xeneral (la estructura `cond`). Foi heredada pol ALGOL, que la popularizó.

Lisp influyó fondamente a Alan Kay, el líder d'investigación del Smalltalk, y entós de la mesma Lisp foi influyíu por Smalltalk, adoptando les carauterístiques de la programación empobinada a oxetos (clases, instancies, etc.) a finales de los años 1970.

En gran parte por cuenta de los sos requerimientos de recursos con respectu al tempranu hardware computacional (incluyendo los primeres microprocesadores), Lisp nun se fixo tan popular fora de la comunidá de AI, como lo fueron el FORTRAN y el descendiente del llinguaxe ALGOL, el llinguaxe C. Llinguaxes más nuevos como Java y Python incorporaron delles versiones llindaes de delles de les carauterístiques de Lisp, pero nun pueden necesariamente brindar la coherencia y la sinergia de los conceutos completos atopaos en Lisp. Por cuenta de la so conveniencia p'aplicaciones mal definíes, complexes, y dinámiques, Lisp tán esfrutando anguaño d'un ciertu resurdimientu del interés popular.

## Llistes
L'elementu fundamental en Lisp ye la llista, nel sentíu más ampliu del términu, pos tanto los datos como los programes son llistes. D'ende vien el so nome, pos Lisp ye un acrónimu de "ListProcessing".

Les llistes en LISP tán delimitadas por paréntesis. D'equí vien el chiste del significáu de LISP: "LostInStupidParentheses" qu'anque con bon humor ye dafechu ficticiu.
 
Dalgunes de les funciones predefinidas de Lisp tienen símbolos familiares (+ pa la suma, * pal productu), pero otres son más exótiques, especialmente dos que sirven precisamente pa manipoliar llistes, descomponiéndoles nos sos componentes. Los sos nomes ("car" y "cdr") son un pocu estraños, reliquies de tiempos pasaos y de la estructura de los ordenadores de segunda xeneración, "car" devuelve la cabeza d'una llista y "cdr" la so cola o restu.

Lisp sigue una filosofía de tratamientu non-destructivu de los parámetros, de cuenta que la mayoría de les funciones devuelven una llista resultáu d'efectuar dalgún tresformamientu sobre la que recibieron, pero ensin alteriar esta postrera.

Unu de los motivos polos que Lisp ye especialmente afechu pa la IA ye'l fechu de que'l códigu y los datos tengan el mesmu tratamientu (como llistes); esto fai especialmente senciellu escribir programes capaces d'escribir otros programes según les circunstancies.

Lisp foi unu de los primeros llinguaxes de programación n'incluyir manexu d'esceiciones coles primitives *catch* y *throw*.

Deriváu de Lisp ye'l llinguaxe de programación Logo. Ensin entrar en detalles, podría dicise que Logo ye Lisp ensin paréntesis y con operadores aritméticos infixos.

## Oríxenes de "car" y "cdr"

* car: Content of Address part of Register
* cdr: Content of Decremental part of Register

Son operaciones del conxuntu d'instrucciones del IBM 704

## Exemplos
### Hola mundu

```lisp
(format t "¡Hola, mundu!")
```


#### Trabayando con llistes

```lisp
*******************************************************************
Definición de la función:

 (defun vacia (l)
 (cond ((null l) 1) ; si la llista esta vacía devuelve 1
 (t 0))) ; n'otru casu (llista llena) devuelve 0

Llamada a la función:

 (vacia '(1 3 4)) ; La llista non esta vacía, devolvería 0
 (vacia '()) ; La llista esta vacía, devolvería 1
*******************************************************************
(defun últimu (llista)
 (cond ((null (cdr llista)) (car llista))
 (t (postreru (cdr llista)))))

(postreru '(1 2 3 4 5 6 7)) ; devuelve'l postreru de la llista: 7


*******************************************************************
; ---FACTORIAL----
;Definición matemática ;
Factorial(x) = 1 si x=0 caso base ;
x*factorial(x-1) si x>0 casu recursivo

;Función factorial fecha con recursividad non final
(defun factorial (n)
 (if (= 0 n)
 1 ; caso base (*
 n (factorial (- n 1))))) ; casu recursivo

(factorial 4) ;esto devolveríanos 24=4*3*2*1




*******************************************************************
```


### Grandes valores de la [[Función de Ackermann]]

```lisp
;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))))))))
```


## Referencies

## Ver tamién

* Intelixencia artificial
* Common Lisp
* Scheme
* Maxima

## Enllaces esternos

* Features of Common Lisp Un discutiniu de delles de les carauterístiques más sobresalientes del llinguaxe.
* Recursos Lisp n'español  Testos n'español y traducciones sobre Lisp, Common Lisp, Emacs Lisp, etc.
* Practical Common Lisp Llibru introductoriu de Common Lisp. Versión on-line y distribuible pola mesma editorial.
* The Nature of Lisp. Una introducción pa entender la naturaleza del llinguaxe y el so poder.

### Aplicaciones en Lisp
Ente les más esitoses aplicaciones escrites en Lisp pueden mentase:
* Emacs, l'editor de testu https://www.gnu.org/software/emacs/emacs.html
* ACL2, el demostrador de teoremes http://www.cs.utexas.edu/users/moore/acl2/
* Maxima, el sistema d'álxebra computacional http://maxima.sourceforge.net/

### Compiladores de Lisp
* GNU Common Lisp, software llibre
* Allegro Common Lisp, software propietariu
* CMU Common Lisp, software llibre
* CLISP, Una implementación de Common Lisp, software llibre
* OpenMCL  Common lisp para Macintosh, software llibre