首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure "DSL“编程

Clojure "DSL“编程
EN

Stack Overflow用户
提问于 2011-10-10 19:35:58
回答 1查看 1.5K关注 0票数 8

我正在使用Clojure和RESTEasy设计一个JAX-RS REST Server。

我的理解是,用Lisp系列语言编写的应用程序比用“传统”命令式语言编写的应用程序更多地被构建为“领域特定语言”。应用程序自下而上地设计为越来越多的“精炼”函数,直到在“顶层”,应用程序变成了对非常高级函数的一系列函数调用。

我正在尝试为我的REST服务器做这件事,从服务URL请求(GET、POST、PUT、DELETE)的资源类开始。

这是我的第一个资源:

代码语言:javascript
复制
(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来做到这一点的建议。如何从领域特定语言的角度来思考呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-21 11:55:51

如果我要做这件事,我想我会从为RESTEasy创建一个环适配器开始。在此之后,Compojure将知道如何以一种与RESTEasy一起工作的方式来处理和响应http请求。这里有一些信息可以帮助你入门。

Ring是一个以标准方式表示http请求和响应的clojure库。本标准是详细的here

它通过接收来自各种库中的任何一个的http请求(即,jetty、netty、finagle)并将其转换为标准表示。然后,它将请求交给请求处理程序(通常使用Compojure进行定义)。然后,处理程序返回一个响应(也在上面的规范中定义)。此响应通过环回转换为jetty、netty等可以理解的形式。

这种转换是由环适配器完成的。有一些列出的here,ring附带了内置的jetty适配器。也许您可以将它们中的一个用作创建RESTEasy适配器的模板。完成后,您可以以标准的方式使用compojure。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7712179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档