Clojure“;DSL“;程序设计

Clojure“;DSL“;程序设计,clojure,dsl,Clojure,Dsl,我正在使用Clojure和设计一个JAX-RSREST服务器 据我所知,用Lisp族语言编写的应用程序比用“传统”命令式语言编写的应用程序更像是“领域特定语言”。应用程序从下到上被设计为越来越多的“细化”函数,直到在“顶层”,应用程序成为一系列对高级函数的函数调用 我正试图为我的REST服务器做这件事,从服务URL请求(GET、POST、PUT、DELETE)的资源类开始 这是我的第一个资源: (ns com.example.server.resources.buildtime (:impo

我正在使用Clojure和设计一个JAX-RSREST服务器

据我所知,用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)))
当使用GET http方法在URL“/buildtime”处调用时,此资源以字符串形式返回服务器构建时间(包含在JSON包中)

我将编写更多这样的资源类和封闭方法(大多数类将有不止一个方法),每个类都有
definterface
deftype
。这似乎是宏的完美用法


我正在征求关于如何作为DSL实现这一点的建议。如何从DSL的角度来思考呢?

如果我要做这件事,我想我应该先为RESTEasy创建一个环形适配器。完成后,Compojure将知道如何以与RESTEasy配合使用的方式处理和响应http请求。这里有一些信息可以帮助您开始

Ring是一个clojure库,它以标准方式表示http请求和响应。本标准较为详细

它通过从各种库(如jetty、netty、finagle)接收http请求并将其转换为标准表示来工作。然后将请求交给请求处理程序(通常使用Compojure定义)。然后处理程序返回一个响应(也在上述规范中定义)。该响应通过回铃转换为jetty、netty等可以理解的形式

此转换由环形适配器完成。这里列出了一些,ring附带了一个内置的jetty适配器。也许您可以使用其中一个作为创建RESTEasy适配器的模板。完成后,您可以以标准方式使用compojure


Ring和compojure是创建DSL的好例子。与所有优秀的DSL一样,它简化了在其问题域(本例中为HTTP服务器)中创建解决方案的过程。它们是如何从DSL的角度思考的好例子。如果你研究它们,你将很好地用DSL来思考。

首先:停止用“类”来思考。它已经是一个DSL,已经有一点潜在的外来语义,您可能不希望在最终的DSL中看到。从正式指定问题开始。列出实体,在它们上面定义一个代数,它将自然地结晶到您的DSL中。只有这样,你才能开始考虑实现。你知道compojure吗?它提供的DSL与您心目中的DSL没有什么不同。我还发现这篇文章有助于进入“dsl模式”。但是想出一个好的DSL似乎不是一件容易的任务…@Paul:我考虑过Compojure。我们已经有了一个用RESTEasy/Java编写的大型REST服务器。如果我使用一个我们熟悉的框架,那么将一个新的基于Clojure的框架轻松地融入到组织中会得到更少的阻力。此外,JAX-RS还有一些非常好的特性。请注意: