我正在設計使用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