2011-10-10 89 views
8

我正在设计使用Clojure和RESTEasy的JAX-RS REST服务器。Clojure“DSL”编程

这是我的理解是Lisp语言编写的家族语言应用,比在“传统”的命令式语言,建立了为“领域特定语言”了。该应用程序的设计自下而上被视为越来越“精炼”的功能,直到在“顶级”级别,应用程序成为对高级功能的一系列函数调用。

我想为我的REST服务器做到这一点,首先是资源类,服务URL请求(GET,POST,PUT,DELETE)。

这是我的第一资源:

(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))) 

这个资源返回服务器构建时间为一个字符串(括在一个JSON包)当在URL“/联编”与HTTP GET方法调用。

我会写更多的这些资源类和封闭的方法(大多数类将有多个方法),每个都有一个definterfacedeftype。这看起来像是宏的完美使用。

我征求建议,这是如何做到的DSL。人们如何思考DSL的思想?

+3

首先:停止思考“班级”。它已经是一个DSL,已经有一些潜在的外来语义,您可能不希望在最终的DSL中看到这些语义。从正式指定问题开始。列出实体,在它们上面定义一个代数,它将自然结晶到你的DSL中。只有这样你才必须开始考虑实施。 –

+1

您是否了解compojure? https://github.com/weavejester/compojure 它提供了一个与你似乎想到的DSL不同的DSL。 我也发现这篇文章http://pragprog.com/magazines/2011-07/growing-a-dsl-with-clojure有助于进入'dsl-mode'。 但是想出一个好的DSL似乎并非易事。 – Paul

+0

@保罗:我考虑过Compojure。我们已经有了一个用RESTEasy/Java编写的大型REST服务器。如果我使用一个我们熟悉的框架,那么将一个新的基于Clojure的组织放入组织将会减少阻力。另外,JAX-RS有一些非常好的功能。 – Ralph

回答

3

如果我执行这项,我想我会通过创建一个的RESTEasy环适配器启动。完成此操作后,Compojure将知道如何处理和响应http请求,并以RESTEasy的方式工作。以下是一些可帮助您开始使用的信息。

环是Clojure的库,代表了一种标准的方式HTTP请求和响应。本标准详述了here

它通过接收来自任何各种库(即jetty,netty,finagle)的http请求并将其转换为标准表示形式来工作。然后它将请求交给请求处理程序(通常这是使用Compojure定义的)​​。处理程序然后返回一个响应(也在上面的规范中定义)。这个响应被转换回到jetty,netty等可以理解的形式。

该翻译是由环适配器完成的。有几个列出的here,ring带有内置jetty的适配器。也许您可以将其中一个用作创建RESTEasy适配器的模板。完成之后,您可以使用标准方式使用compojure。

环和的Compojure是如何创建一个DSL很好的例子。像所有优秀的DSL一样,它简化了在其问题域中创建解决方案(在这种情况下为HTTP服务器)。他们是如何在DSL方面思考的绝佳例子。如果你研究它们,你就会很好地朝着思考DSL的方向前进。