我正在设计使用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方法调用。
我会写更多的这些资源类和封闭的方法(大多数类将有多个方法),每个都有一个definterface
和deftype
。这看起来像是宏的完美使用。
我征求建议,这是如何做到的DSL。人们如何思考DSL的思想?
首先:停止思考“班级”。它已经是一个DSL,已经有一些潜在的外来语义,您可能不希望在最终的DSL中看到这些语义。从正式指定问题开始。列出实体,在它们上面定义一个代数,它将自然结晶到你的DSL中。只有这样你才必须开始考虑实施。 –
您是否了解compojure? https://github.com/weavejester/compojure 它提供了一个与你似乎想到的DSL不同的DSL。 我也发现这篇文章http://pragprog.com/magazines/2011-07/growing-a-dsl-with-clojure有助于进入'dsl-mode'。 但是想出一个好的DSL似乎并非易事。 – Paul
@保罗:我考虑过Compojure。我们已经有了一个用RESTEasy/Java编写的大型REST服务器。如果我使用一个我们熟悉的框架,那么将一个新的基于Clojure的组织放入组织将会减少阻力。另外,JAX-RS有一些非常好的功能。 – Ralph