Dónde aprender a utilizar de forma práctica Common Lisp [cerrado]

79

Soy un programador de C ++ que intenta aprender Common Lisp. He mirado algunos libros como Land of Lisp y he leído numerosos artículos en línea sobre las diversas virtudes de Lisp. Sin embargo, necesito algunos consejos.

Casi todo lo que he leído sobre Common Lisp tiene que ver con lo asombroso que es y lo increíblemente rápido que se pueden hacer cosas con él y cómo resolvió asombrosamente muchos problemas con los lenguajes de programación modernos hace 30 años. También lo asombrosas que son las macros, y cómo cada paradigma de programación (OO, funcional, basado en actores o lo que sea, etc.) puede usarse en Lisp, y cómo las listas son la estructura de datos definitiva. Básicamente, tratar Lisp como un lenguaje de investigación y decir cuán diferente y revolucionario es.

Y todo eso probablemente sea cierto, pero el problema es que no he visto muchas cosas sobre cómo hacer cosas prácticas como leer un archivo, dividirlo en palabras y procesarlo. No estoy interesado en aprender Common Lisp por aprender Common Lisp, sino por hacer lo que solía hacer en C ++ más rápido y con menos errores.

Entonces, mi pregunta es cuál es el mejor recurso (ya sea un sitio web, un libro, cualquier cosa) que se enfoca en enseñar cómo usar Common Lisp para realizar tareas de programación comunes como

  • Cómo leer archivos
  • Cómo leer un archivo, reemplazar palabras en el archivo y volver a escribir el resultado en el archivo
  • Itere los archivos en un directorio y otras cosas del sistema de archivos
  • Interactuar con una base de datos SQL
  • Hacer comunicaciones sobre enchufes
  • Subprocesos para cosas como un servidor web
  • Crear GUI
  • Realizar operaciones en archivos binarios
  • Escriba un analizador (no un intérprete para Lisp en Lisp, que según tengo entendido es como 5 líneas de Lisp)
  • Interactuar con el sistema operativo (es decir, cosas escritas en C o C ++) para hacer cosas que Lisp no puede hacer de forma nativa
  • Cómo escribir extensiones Lisp en C (¿es eso posible?)
  • Incrustar un intérprete lua (¿es posible?)

Y también en una nota práctica menos inmediata, cómo implementar estructuras de datos comunes en lisp como un montón, pila, árbol de búsqueda binaria, etc. Sin embargo, eso puede ser simplemente usando las operaciones de lista de Lisp como cary cdrde la manera correcta. No lo sé.

Dudo mucho que algo de esto (con la improbable excepción de los dos últimos de la lista) sea imposible con Lisp o a la gente no le encantaría tanto. Y lo antes mencionado que he leído menciona un montón de software del mundo real escrito en Lisp (me viene a la mente la tienda web de Yahoo!).

Sin embargo, teniendo la programación en un lenguaje imperativo ( ¿el? ) Antes, estoy ansioso por usar los nuevos conocimientos que obtengo para escribir aplicaciones del mundo real. Entonces, ¿cuál es la forma más rápida de aprender a escribir software práctico con Lisp?

Por cierto, he visto Practical Common Lisp de Peter Seibel pero, a juzgar por el TOC, solo toca algunas de las cosas que me gustaría aprender a hacer con Lisp.

Una pregunta más si puedo (lo siento si esto es combinar dos preguntas en una), ¿dónde puedo encontrar una referencia a las funciones de Lisp y esas cosas?

Y realmente quiero que me guste Lisp.

NewLisper
fuente
3
Buena pregunta. Yo mismo, siendo programador en C ++, he estado aprendiendo Lisp este verano, principalmente con los libros propuestos en las respuestas. Muy feliz hasta ahora, pero todavía me estoy abriendo camino a través de las macros. On Lisp de Paul Graham es una verdadera joya. Además, el material en Emacs Lisp le ayuda a mantenerse al tanto de Lisp en general, así como también le permite escribir scripts realmente útiles desde el propio editor.
Diego Sevilla
Ahora hay una extensa página de recursos de Common Lisp en la página de introducción de Common Lisp en Docs.SO.
Gustav Bertram
También hay un libro de cocina Common Lisp actualizado . Sin embargo, su TOC aún no es tan extenso, por lo que buscamos bibliotecas increíbles y modernas en la lista Awesome CL . Y +1 para las "Recetas CL" de E. Weitz.
Ehvince

Respuestas:

95

Propondría leer ' Practical Common Lisp ', ya que ya responde algunas de sus preguntas.

Probablemente hay de tres a cuatro libros que debería leer :

Referencia común de Lisp

Manuales

Ahora, lo siguiente que debe consultar es el manual de su implementación Lisp. Describe muchas extensiones específicas: redes, hilos, ...

Documentación para implementaciones de Common Lisp:

SLIME (Lisp-IDE basado en Emacs) tiene un manual de usuario de SLIME .

Documentación para bibliotecas Common Lisp:

Bibliotecas

Para uso de bibliotecas

Ahora, analizando algunos de sus puntos:

  • Cómo leer archivos

Consulte el diccionario de archivos y secuencias en HyperSpec . CON-OPEN-STREAM, READ, READ-LINE, READ-CHAR, READ-BYTE, READ-SEQUENCE, ...

  • Cómo leer un archivo, reemplazar palabras en el archivo y volver a escribir el resultado en el archivo

Utilice arriba. Ver también: ESCRIBIR y relacionados.

  • Itere los archivos en un directorio y otras cosas del sistema de archivos

Véase más arriba. DIRECTORIO, nombres de ruta, ...

  • Interactuar con una base de datos SQL

Utilice, por ejemplo, la biblioteca CLSQL.

  • Hacer comunicaciones sobre enchufes

Consulte el manual de su Lisp o use una de las bibliotecas portátiles. Consulte Quicklisp.

  • Subprocesos para cosas como un servidor web

Consulte el manual de su Lisp o use una de las bibliotecas portátiles. Consulte Quicklisp.

  • Crear GUI

Depende. Consulte Quicklisp o una biblioteca específica de implementación.

  • Realizar operaciones en archivos binarios

Consulte Hyperspec para las operaciones de archivos y secuencias. WRITE-BYTE, READ-BYTE. Abra una secuencia como una secuencia binaria.

  • Escriba un analizador (no un intérprete para Lisp en Lisp, que según tengo entendido es como 5 líneas de Lisp)

Utilice una de las herramientas existentes para eso. Estudie los analizadores sintácticos existentes. Hay muchos analizadores sintácticos escritos en Lisp, pero no muchos en libros sobre eso (aparte de los analizadores sintácticos de lenguaje natural, que se describen en la literatura sobre IA).

  • Interactuar con el sistema operativo (es decir, cosas escritas en C o C ++) para hacer cosas que Lisp no puede hacer de forma nativa

Depende. Consulte Quicklisp o una biblioteca específica de implementación.

  • Cómo escribir extensiones Lisp en C (¿es eso posible?)

Depende. Consulte Quicklisp o una biblioteca específica de implementación. -> FFI

Consejo final: lea el código de otros autores.

Estudie otro código Lisp. Hay suficiente código Lisp muy diverso por ahí. Desde servidores web hasta software de composición musical.

Rainer Joswig
fuente
2
Parece que muchas cosas son específicas de la implementación. ¿Hay algo como C que no sea específico de la implementación sino específico del sistema operativo ? Parece que no es factible hacer que todos los que quieran su código usen la implementación que eligió. Además, no estoy realmente interesado en la IA.
NewLisper
4
@NewLisper: hay muchas bibliotecas de portabilidad. Consulte Quicklisp.
Rainer Joswig
4
@NewLisper: incluso si no está interesado en la IA, debería leer parte de la literatura, ya que describe el enfoque de 'programación simbólica' para el que se inventó Lisp.
Rainer Joswig
2
@NewLisper: Esta es una respuesta bastante completa. Lisp está más cerca de Python en cómo se relaciona con las llamadas de OS & C / C ++. Se dice que es bastante sencillo armar una FFI (interfaz de función externa). También vale la pena señalar que parece que la preponderancia de usuarios de Common Lisp en la web parece estar usando SBCL.
Paul Nathan
2
Agregaría algunas bibliotecas concretas: sockets: usocket; servidor web: hunchentoot; roscado: bordeaux-threads, chanl; Interacción con el sistema operativo / vinculación de elementos C: CFFI, UFFI
Svante
6

Echa un vistazo a Cliki, el wiki de Common Lisp que proporciona una lista de bibliotecas disponibles para Common Lisp que te ayudarán a realizar todos tus elementos.

Además, querrá consultar el libro de cocina Common Lisp (también hay una versión más actualizada ). Tiene un montón de código para tareas comunes, tales como la lectura de una línea de un archivo a la vez , y las interfaces de función Exterior para interactuar con bibliotecas escritas en C .

Puede escribir extensiones para Lisp en C dependiendo de la implementación que esté usando. Emacs-Lisp, por ejemplo, le permite hacer eso aunque no es Common Lisp. Por lo general, lo que desea hacer es escribir el código en Common Lisp y luego optimizarlo tanto como sea posible usando diferentes declaraciones del compilador Lisp, o el otro método donde usa una interfaz de función externa.

El subproceso depende de la implementación que uses, pero creo que la mayoría de ellos ahora tienen subprocesos.

Hunchentoot es uno de los mejores servidores web Lisp y es bastante fácil comenzar con él. No tiene que escribir ningún código de subprocesamiento usted mismo, solo tiene que escribir las funciones del controlador de solicitudes HTTP.

Alguien compiló una lista de opciones de GUI para Lisp :

  • cl-gtk2, una interfaz para la biblioteca de gui GTK
  • McClim
  • Granate
  • Qt común
  • EQL

fuente
1
El libro de cocina Common Lisp parece realmente útil. Como le dije al otro chico, parece que muchas cosas son específicas de la implementación. No parece justo hacer que todas las personas que desee para ejecutar su código usen la misma implementación que usted. ¿Es así como es?
NewLisper
Sí, así es como es, algunas personas intentan apegarse al estándar ANSI Common Lisp o intentan ceñirse a las bibliotecas que funcionan en múltiples implementaciones para que no sea una molestia.
¿Pierde la capacidad de hacer muchas cosas si se apega a ANSI Common Lisp, como cosas del sistema de archivos, cosas de redes, etc.?
NewLisper
Lisp facilita la escritura de bibliotecas portátiles sobre API específicas de implementación, por lo que no me preocuparía por eso.
Pavel Penev
Oye, ¿te importaría cambiar la URL del libro de cocina a lispcookbook.github.io/cl-cookbook ? Es el mismo contenido, pero en gran medida aumentado, las cosas obsoletas se eliminaron y en una forma más atractiva. ¡Mira su historia de git! Gracias.
Ehvince