Estoy diseñando un servidor REST JAX-RS usando Clojure y RESTEasy.Programación Clojure "DSL"
Tengo entendido que las aplicaciones escritas en lenguajes de familias Lisp son, más que en los lenguajes imperativos "tradicionales", creadas como "lenguajes específicos de dominio". La aplicación se diseña de abajo arriba como más y más funciones "refinadas" hasta que, en el nivel "superior", la aplicación se convierte en una serie de llamadas a funciones de muy alto nivel.
Estoy intentando hacer esto para mi servidor REST, comenzando con las clases de recursos que sirven las solicitudes de URL (GET, POST, PUT, DELETE).
Aquí es mi primer recurso:
(ns com.example.server.resources.buildtime
(:import [javax.ws.rs CookieParam GET Produces Path]
[javax.ws.rs.core Context Cookie NewCookie Response UriInfo]
[org.jboss.resteasy.annotations.providers.jaxb Formatted]))
(definterface BuildTime
(getBuildTime [^javax.ws.rs.core.UriInfo info
^javax.ws.rs.core.Cookie security-cookie]))
(deftype
^{Formatted true}
BuildTimeResource []
BuildTime
(^{GET true
Path "/buildtime"
Produces ["application/json"]}
getBuildTime
[this info security-cookie]
(.. (Response/ok "20111009") build)))
Este recurso devuelve el tiempo de creación de servidores como una cadena (encerrado en un paquete JSON) cuando se llama a la URL "/ Buildtime" con el método HTTP GET.
Escribiré muchas más de estas clases de recursos y métodos incluidos (la mayoría de las clases tendrán más de un método), cada una con un definterface
y un deftype
. Esto parece ser un uso perfecto para macros.
Estoy solicitando sugerencias sobre cómo se podría hacer esto como una DSL. ¿Cómo se puede pensar en términos de DSL?
Para empezar: deje de pensar en términos de "clases". Ya es un DSL, ya un poco de semántica potencialmente alienígena que puede que no desee ver en la DSL final. Comience especificando el problema formalmente. Enumere las entidades, defina un álgebra sobre ellas y cristalizará de forma natural en su DSL. Solo entonces debes comenzar a pensar en la implementación. –
¿Conoces el compojure? https://github.com/weavejester/compojure Proporciona un DSL similar al que parece tener en mente. También encontré este artículo http://pragprog.com/magazines/2011-07/growing-a-dsl-with-clojure útil para entrar en 'dsl-mode'. Pero crear un buen DSL no parece una tarea fácil ... – Paul
@Paul: Consideré Compojure. Ya tenemos un gran servidor REST escrito en RESTEasy/Java. Facilitar una nueva versión basada en Clojure en la organización tendrá menos resistencia si utilizo un marco con el que estamos familiarizados. Además, JAX-RS tiene algunas características muy agradables. – Ralph