Clojure“DSL”编程

8
我正在使用Clojure和RESTEasy设计JAX-RS REST服务器。
我理解,与“传统”的命令式语言相比,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格式返回服务器构建时间的字符串,当使用GET http方法调用URL“/buildtime”时。
我将编写更多的这些资源类和封闭方法(大多数类将具有多个方法),每个都有一个definterface和deftype。这似乎是宏的完美用法。
我正在征求关于如何将其作为DSL完成的建议。如何考虑DSL?

3
首先,停止以“类”为思维方式。这已经是一种领域特定语言(DSL),可能有一些你不想在最终DSL中看到的潜在陌生语义。首先正式地规定问题。列出实体,定义它们之间的代数关系,然后它自然而然地会形成你的DSL。只有在这之后你才需要开始考虑实现。 - SK-logic
1
你知道Compojure吗?https://github.com/weavejester/compojure 它提供了一种DSL,与你所想的类似。 我还发现这篇文章http://pragprog.com/magazines/2011-07/growing-a-dsl-with-clojure有助于进入“DSL模式”。 但是设计一个好的DSL似乎并不容易... - Paul
@Paul:我考虑了Compojure。我们已经有一个用RESTEasy / Java编写的大型REST服务器。如果我使用我们熟悉的框架,轻松地将一个基于Clojure的新框架引入组织中,那么会得到更少的阻力。此外,JAX-RS具有一些非常好的功能。 - Ralph
1
观看:http://blip.tv/clojure/christophe-grand-not-dsl-macros-4540700 - Alex Taggart
1个回答

3
如果我在进行这项工作,我会首先创建一个适用于RESTEasy的环形适配器。完成后,Compojure将知道如何以与RESTEasy兼容的方式处理和响应http请求。以下是一些信息,可帮助您入门。
Ring是一个Clojure库,以标准方式表示http请求和响应。该标准详细说明在此处
它通过从各种库(例如jetty、netty、finagle)接收http请求并将其转换为标准表示来工作。然后,它将请求交给请求处理程序(通常使用Compojure定义)。处理程序然后返回响应(也在上述规范中定义)。Ring将此响应转换回jetty、netty等可以理解的形式。
这篇翻译是由Ring适配器完成的。这里列出了几个适配器,而Ring内置了一个适用于Jetty的适配器。也许你可以使用其中之一作为创建RESTEasy适配器的模板。完成后,您可以按照标准方式使用compojure。
Ring和compojure是创建DSL的绝佳示例。像所有良好的DSL一样,它简化了在其问题域中(在本例中为HTTP服务器)创建解决方案的过程。它们是如何思考DSL的绝佳示例。如果您研究它们,您将很快开始按照DSL的方式思考。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接