LISP (y dialectos como Scheme, Common LISP y Clojure) no han obtenido mucho apoyo de la industria a pesar de que son lenguajes de programación bastante decentes. (Por el momento, aunque parece que están ganando algo de tracción).
Ahora, esto no está directamente relacionado con la pregunta, ¿cuál sería usar un dialecto LISP para un programa de producción? ¿Qué tipo de programa y por qué? También se incluyen los usos del tipo de integración en algún otro código (por ejemplo, C), pero tenga en cuenta que es lo que quiere decir en su respuesta. Se prefieren conceptos amplios, pero las aplicaciones específicas también son aceptables.
Respuestas:
¿Usarías un dialecto LISP para un programa de producción?
Absolutamente
¿Qué tipo de programa y por qué?
Lisp es un lenguaje dinámico de propósito general. Hoy en día, tiene las mismas dificultades básicas que otros lenguajes dinámicos de propósito general que no son publicados por Microsoft: hilos nativos, integración GUI, operación determinista del GC y huellas de memoria pequeñas.
Los hilos nativos son logrados por LispWorks y SBCL, creo. Posiblemente otros? No he investigado completamente.
LispWorks y Franz Common Lisp - productos comerciales - se integran en la GUI para grados de éxito. Al no tener el $$ para comprarlos, no sé qué tan bien funciona. Sospecho que funcionan bastante bien ...
Una operación GC determinista se puede hacer (se hace en Java a un cierto nivel de éxito), pero yo no sé si los sistemas existentes Lisp (unos) mantenidos tienen ningún código para hacer eso.
La pequeña huella de memoria, creo, es lograda por algunos Lisps.
Mi punto básico es que Common Lisp está técnicamente listo para hacer sistemas de producción. Y lo hace .
La gran mayoría de los desarrolladores se asustan por (elegir uno) lenguajes dinámicos, macros, paréntesis, falta de IDE favorito, mala experiencia en la universidad, no hay muchos trabajos, y luego no lo usan.
Personalmente, saltaría a la construcción de un sistema de producción completo en Common Lisp desde cero en un entorno de equipo.
editar: Realmente no respondí por qué Lisp en comparación con otros idiomas.
En mi experiencia con Lisp, no significativa, pero considerablemente más que 'hola mundo', he encontrado que el lenguaje es extremadamente útil después de los primeros dolores de "Argh new language". La mayoría del lenguaje se combina de una manera muy regular y bastante obvia que realmente no encuentro otros idiomas para operar. Parte de esto es la fusión de expresiones y declaraciones. Parte de esto es el tipo de datos de la lista principal. Parte de esto es el sistema de tipos. Parte de esto es el sistema macro. No me malinterpreten, sin embargo, no son puntos de dolor. Pero no me patean en la cara tanto como los puntos débiles de otros idiomas.
Un ejemplo simplista es la rutina de longitud de lista de Python. El enfoque de Python es llamar
len(mysequence)
. Pero, si lo pensamos bien, una longitud es una propiedad de una secuencia. Entonces,mysequence.len()
es una idea más apropiada. Lisp esencialmente elimina esa distinción sintáctica.(length thing)
es tanto la sintaxis de llamada de función como la sintaxis de método. Por supuesto, algunas personas lo encuentran frustrante y quieren la diferencia sintáctica. Prefiero tener la regularidad.edit2: Convertí la parte de mi tesis de MS que se ejecuta en el escritorio a Common Lisp y hasta ahora ha sido un placer trabajar con ella.
fuente
Personalmente, sé de personas que usan Lisp en forma de Clojure en un par de bancos de inversión y nuevas empresas en Londres. También elegí Clojure como el lenguaje de desarrollo principal para mi propia startup, así que estoy dispuesto a poner mi dinero donde está mi boca :-)
Descubrí que fue una experiencia muy esclarecedora aprender Clojure durante el año pasado (después de mucha experiencia con Java y C #). Las razones principales para esto son:
También parece ser una opción práctica para el uso real de producción por las siguientes razones:
fuente
Usaría LISP si fuera la mejor opción para el trabajo. Solo algunas cosas que influyen en la "mejor opción":
Todos estos factores deben considerarse al decidir si LISP es apropiado para un proyecto. En el mundo corporativo, nunca lo he experimentado.
fuente
Absolutamente. Paul Graham lo explica bien .
fuente
Dónde: Emacs es una aplicación del mundo real que usa LISP.
Por qué: fue una excelente manera de expresar el mapeo entre la pulsación de tecla y la acción. Se interpreta y es rápido y está bien definido y es simple.
fuente
Tanto Macsyma como Autocad se basan en un dialecto de Lisp. Los clasificaría como 'mundo real', así como Emacs.
fuente
Absolutamente lo consideraría. Especialmente para nuevos trabajos de desarrollo que tenían un potencial informático paralelo. Ese parece ser un punto ideal para este tipo de lenguajes funcionales.
fuente
Lisp es una de las mejores opciones para implementar compiladores. Y, a medida que aumenta el uso de DSL y eDSL, Lisp se está volviendo más valioso. Estoy usando un dialecto Lisp para todas mis tareas relacionadas con DSL.
fuente
En este momento estoy tratando de usar newLisp como reemplazo de Php en mi sitio web personal a través del marco Dragonfly . Si puedo descubrir cómo hacer que Apache juegue bien, lo usaré (el servidor web incorporado funciona muy bien, pero preferiría trabajar a través de Apache). Y una vez que eso suceda, usaré newLisp en cualquier lugar donde usaría Php, porque no me gusta Php y me gusta newLisp.
En este momento, Clojure no es una buena opción para las aplicaciones de Android, pero sé que la gente está trabajando en eso. Entonces, si eso se resuelve, ese sería otro lugar para el que usaría un dialecto de Lisp para aplicaciones del mundo real ... pero nuevamente, esto es porque simplemente no me gusta Java.
Pero, sinceramente, prefiero Ruby a Lisp ... pero esto es principalmente una cuestión de comunidad y documentación.
fuente
Implementé una aplicación comercial patentada en Common Lisp llamada Tankan que se ejecuta en Microsoft Windows como un ejecutable nativo.
Es un programa para entrenarse para memorizar caracteres kanji japoneses.
El programa se ejecuta como un servidor HTTP en segundo plano. La ejecución de este servidor y la navegación a sus páginas está coordinada por una pequeña aplicación de icono del área de notificación del sistema (también conocida como "Bandeja") que desarrollé usando Visual C ++.
La aplicación de icono de bandeja pequeña se inicia, monitorea y detiene el servidor basado en Lisp, y se comunica con él utilizando tuberías Win32 vinculadas a su entrada y salida estándar. A través de una tubería, el servidor Lisp informa a la aplicación del icono de la bandeja de la URL precisa con el número de puerto correcto, y esa aplicación de icono de la bandeja puede iniciar el navegador a través de la API de Shell para explorar esa URL. El usuario solo hace doble clic en el icono para que aparezca la IU.
El programa Lisp mantiene en su memoria un estado de sesión bastante complejo que contiene el historial de entrada del usuario y varias relaciones entre varios objetos. La notación de objetos circulares de Lisp (habilitada por la
*print-circle*
variable) y cómo funciona a través deprint-object
métodos CLOS personalizados es de gran ayuda para implementar la persistencia: los usuarios pueden guardar el estado en el disco y reanudar donde lo dejaron. Todo se guarda, incluido el estado de la interfaz de usuario. Hay una gran cantidad de subestructura compartida en el gráfico de objetos, así como ciclos. Además, una gran cantidad de información estática que no tiene que ser persistente, como el contenido de los objetos de entrada del diccionario. Con los métodos de objetos de impresión personalizados ANSI Common Lisp, puede crear representaciones impresas condensadas para objetos que, sin embargo, son legibles por máquina,Casi no se usa JavaScript en la interfaz de usuario web. Incluso los controles para ocultar y mostrar partes de la interfaz de usuario se realizan mediante el envío de formularios y la representación del HTML. Por lo tanto, cada detalle del estado de la IU está en el servidor y persiste cuando el usuario guarda. La regeneración del HTML es muy rápida. Se realiza mediante una expresión de comillas gigantes de Lisp que alimenta una macro generadora de HTML. El código compilado por Clozure Common Lisp (CCL) hace que esto suceda tan rápido que apenas se da cuenta de que cuando hace clic en un botón [+] en la interfaz de usuario para abrir algo, está enviando una solicitud a un servidor que regenera el página completa, y no simplemente ejecutando JavaScript local para cambiar la visibilidad de un elemento de documento local.
El programa fue desarrollado originalmente con CLISP. Gracias a que ANSI CL es un lenguaje estándar, con implementaciones que se ajustan bien y no hay demasiadas trampas engañosas en el lenguaje (comportamiento "indefinido" o "definido por la implementación") se transfirió fácilmente a CCL.
CLISP no ha sido abandonado; todavía se usa para alimentar el back-end de licencias, utilizando gran parte de la misma base de código común.
Desarrollé un sistema de licencia original para el programa, utilizando criptografía de curva elíptica proporcionada por la biblioteca IronClad, que es utilizada por el servidor de licencias para firmar licencias para certificarlas. (Creo recordar que podría haber utilizado el programa de línea de comandos de OpenSSL para generar los parámetros EC para la clave del servidor).
Las licencias se representan como objetos Lisp. Es un tributo a la portabilidad de Lisp que un programa de Windows compilado por Clozure Common Lisp pueda generar una licencia basada en S-expresión, un programa CLISP que se ejecute en un servidor Debian puede completar el campo de firma digital faltante en ese objeto y enviarlo de nuevo a El programa de Windows que puede validar la firma.
En el servidor, además del servicio de licencias basado en CGI, utilizo una API de línea de comandos simple para administrar licencias. Puede enumerar licencias, encontrar licencias específicas y editar sus atributos, como por ejemplo editar la fecha de vencimiento de una licencia temporal para otorgar una excepción a un usuario. El back-end de licencias también genera correos electrónicos. No utilicé ninguna biblioteca para el manejo de CGI en el lado del servidor: solo código Lisp enrollado a mano para tratar con las variables de entorno de Apache y los argumentos de la línea de comandos. (Aunque el código de la biblioteca se utiliza para tratar la codificación de URL y la generación de HTML). No se utiliza ninguna base de datos para el almacenamiento; las licencias se clasifican en un archivo llamado
licenses.lisp
y eso es todo.fuente
Si alguien me pagó, claro.
Sin embargo, probablemente estarían más interesados en pagarle a alguien que conoce el idioma. Solo he jugado con elisp y esquema algunas veces.
fuente