2012-04-07 18 views
16

Tengo curiosidad sobre el uso de Lisp para sustentar un moderno servicio web RESTful, pero dadas las numerosas variantes e implementaciones, es difícil saber por dónde empezar.Servicio web con Lisp

Estoy seguro de que hay personas usando Lisp para aplicaciones relacionadas con la web (simplemente navegando por las preguntas aquí en SO lo demuestra) pero lo que me gustaría saber es ¿Hay alguna implementación de Lisp que sea más adecuada para servicios web que otros? (compatibilidad con Unicode nativo, por ejemplo, librerías incorporadas relacionadas con la web, rendimiento, etc.)

No estoy buscando "hacks" o marcos web unicode. Estoy más interesado en lo que obtienes de la caja. No me he alineado con ningún derivado o implementación de Lisp, aunque tengo alguna experiencia menor con Common Lisp en CLISP (una calculadora polinómica genérica como parte de un curso de informática de pregrado). Sería bueno saber si hay opciones particularmente buenas para este problema, especialmente de aquellas personas que realmente han usado Lisp de esta manera.

Respuesta

13

Racket La biblioteca estándar contiene web server library. Jugué con eso, pero sentí que no era adecuado para mi forma interactiva preferida de trabajar con un Lisp. Tiene algunas características agradables, como el flujo de control basado en la continuación, por lo que vale la pena echarle un vistazo.

Hablando desde la experiencia personal, Common Lisp es una gran opción para el desarrollo web. Es en lo que se implementa mi blog. Hunchentoot es simple y poderoso y muy Lispy. La programación interactiva es compatible tan bien como se puede imaginar, y hay complementos para cosas como Websockets (que aún no he necesitado).

Dicho esto, la programación web en Clojure es igual de agradable. Implementé un centro comunitario basado en la web para mi familia usando Clojure y Noir. Stylewise, Noir es muy similar a una combinación de Hunchentoot y cl-who. Como beneficio adicional, el acceso a las bibliotecas de Java puede ser extremadamente útil. (En mi caso, la implementación del soporte de inicio de sesión de OpenID, que hubiera sido difícil con Common Lisp, fue muy fácil con Clojure). Debido a esto, si su aplicación necesita interactuar con servicios web de terceros o formatos de datos, le sugiero que tome una buena y larga mirada a Clojure.

Las interfaces REST también son fáciles de hacer en entornos web estilo Hunchentoot/Noir. No puedo juzgar el servidor web de Racket en este sentido, ya que no estoy lo suficientemente familiarizado con él.

+0

He echado un vistazo rápido a Hunchentoot, pero parece apoyar un conjunto limitado de verbos, ¿es correcto? (GET y POST) - Necesitaría algo un poco más versátil que eso. El acceso a los encabezados de solicitud y respuesta raw en bruto es muy importante en un servicio web. Clojure/Noir parece proporcionar ese acceso. Creo que Racket también puede acceder a los encabezados sin procesar, pero sin duda requerirá más que un rápido vistazo para evaluar la naturaleza de Racket. Tal vez algunos defensores de Racket dejarán algunos comentarios. –

+2

@MattEsch Con Hunchentoot, puede acceder al método de solicitud utilizando la función 'request-method *'. Incluso 'define-easy-handler' no se preocupa demasiado por el verbo; puedes hacer una solicitud' CASTMAGIC' si quieres, y funcionará. :) (Intente escribir un controlador simple que devuelva simplemente '(symbol-name (hunchentoot: request-method *))'.) Con Noir, hay soporte directo para los verbos HTTP estándar ('GET',' POST', 'PUT',' DELETE', 'HEAD') en el mecanismo de envío. Tanto Hunchentoot como Noir te permiten acceder a los encabezados de solicitud HTTP. –

+0

Gracias por la aclaración. Estaba confundido sobre por qué los documentos estaban haciendo un punto de los verbos específicos GET y POST (como si fuera una especie de novedad). Gracias por aclarar eso. Iré con Hunchentoot y veré qué puedo hacer. Dejaré la pregunta abierta por ahora solo para ver si da otras respuestas. –

6

Sé que uno puede que se adapte a su necesidad: Clack

Clack es un entorno de aplicaciones web para Common Lisp inspirado en WSGI de Python y Ruby rack.

Espero que ayude.