2011-10-10 41 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的方向前進。