#+TITLE: Nadando entre paréntesis
#+TITLE: Una introducción a Common Lisp
#+AUTHOR: Camilo Meza Gaete
#+EMAIL: camilo.meza.g@member.fsf.org
* Un poco de historia
** Orígenes
Se especifica la familia de lenguajes conocida como *lisp* en 1958, por John McCarthy.
[[./McCarthy.png]]
** Un estándar
En 1981 se comienza a trabajar en el desarrollo de un dialecto estándar de lisp.
[[./Steel.jpg]]
** ANSI
Este dialecto, llamado /common lisp/ sería definido por la publicación de 1994 del Instituto de Estándares Nacionales Americano (ANSI por sus siglas en inglés).
** Implementaciones
Existen varias implementaciones del lenguaje ANSI Common Lisp, las más conocidas son:
- Steel Bank Common Lisp (SBCL)
- CLISP
- Carnegie Mellon University Common Lisp (CMUCL)
* Sintaxis
** Expresiones S
La sintaxis de los lenguajes lisp es bastante concida: Utilizan paréntesis (()) y notación polaca (o prefija)
#+begin_src lisp
(+ 2 3 4)
#+end_src
** Expresiones S
En este caso, nuestra expresión sería graficada así:
+
/ \
2 +
/ \
3 4
\
()
** Expresiones S
Como se puede observar, en /common lisp/ se utiliza una función seguida de sus argumentos.
#+begin_src lisp
(defun cuadrado (x)
(* x x))
(cuadrado 5)
#+end_src
** Tipos de datos
- Símbolos:
esto-es-un-simbolo, nil, t
- Palabras clave:
:clave
- Cadenas de texto:
"Ejemplo de cadena"
- Números:
3 3,14 3/10
** Tipos de datos
- Listas:
(esto es una lista) (esto (también)) (esta (lista (incluye ("numeros" 5))))
** Tipos de datos
Ya que Lisp viene de LISt Processor, construiremos nuestras listas enlazadas como cadenas similares a las de un tren:
.o _________
. ______ ______________ | | _____
_()_||__|| ________ | | |_________| __||___||__
(BNSF 1995| | | | | __Y______00_| |_ _|
/-OO----OO""="OO--OO"="OO--------OO"="OO-------OO"="OO-------OO"=P
###################################################################
|---car-----| |-------------------cdr-----------------------------|
** Celdas Cons
Conseemos:
#+begin_src lisp
(setf lista '(A B C))
(car lista)
#+end_src
** Celdas Cons
#+begin_src lisp
(setf lista '(A B C))
(cdr lista)
#+end_src
** Celdas Cons
#+begin_src lisp
(setf lista '(A B C))
(car (cdr lista))
#+end_src
** Celdas Cons
#+begin_src lisp
(setf lista '(A B C))
(cdr (cdr (cdr lista)))
#+end_src
** Evaluación
En cualquier implementación de *common lisp* las listas escritas serán evaluadas (en el sentido matemático de la expresión).
** Evaluación
Es por esto que se dice "los datos son tratados como código" en clisp. A menos que se explicite, la implementación intentará evaluar los símbolos, para ello se usa el *modo dato* que comienza con un apóstrofe.
** Evaluación
Las listas evaluadas son conjuntos de celdas cons, y el único valor *falso* en clisp es una lista vacía
#+begin_src lisp
(if '()
'la-lista-tiene-cosas
'la-lista-está-vacía)
#+end_src
* ¿Cómo iniciar?
** Elegir una implementación
Como se dijo anteriormente, existen varias implementaciones que permiten interactuar con el REPL. Puedes visitar sus páginas y utilizar la que más se acomode a tus necesidades
** Trabajar con un editor de texto
Cualquier editor de texto servirá para escribir programas en clisp; aunque personalmente recomiendo GNU Emacs.
** Ejemplo de entorno para Emacs
GNU Emacs tiene dos modos que permiten trabajar con lisp: SLIME y SLY.
Ambos pueden utilizar la implementación elegida para entregar una REPL a través de Emacs, por lo que la decisión sólo se basa en experiencia personal.
** Mi entorno de trabajo
- Emacs
- SLY
- SBCL
** Fuentes útiles
[[https://common-lisp.net/][Repositorio de proyectos]]
[[http://quickdocs.org/][Fuente de documentación de bibliotecas en clisp]]
[[https://borretti.me/article/common-lisp-sotu-2015][Estado del ecosistema clisp (2015)]]
[[https://video.hardlimit.com/video-channels/lispeandolacasa/videos][Vídeos del proyecto "lispeando la casa" para la documentación y el aprendizaje]]
* Ejemplos y programas conocidos
** Ciencias
Grammarly es un motor de análisis gramático escrito en /common lisp/.
Maxima es un CAS programado con clisp.
[[http://maxima.sourceforge.net/es/index.html][Página oficial del proyecto]]
** Gráficos
El videojuego "Jak and Daxter" utiliza un DSL en clisp mediante la implementación AllegroCL
[[https://franz.com/success/customer_apps/animation_graphics/naughtydog.lhtml][Enlace de la entrevista, con vídeo incrustado]]