gpt4 book ai didi

Clojure "DSL"编程

转载 作者:行者123 更新时间:2023-12-03 00:31:10 25 4
gpt4 key购买 nike

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

当使用 GET http 方法在 URL“/buildtime”调用时,此资源以字符串形式返回服务器构建时间(包含在 JSON 包中)。

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

我正在征求有关如何将其作为 DSL 完成的建议。如何从 DSL 角度进行思考?

最佳答案

如果我要这样做,我想我会从为 RESTEasy 创建一个环形适配器开始。完成此操作后,Compojure 将知道如何以与 RESTEasy 配合使用的方式处理和响应 http 请求。以下是一些可帮助您入门的信息。

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

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

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

Ring 和 compojure 是如何创建 DSL 的绝佳示例。与所有优秀的 DSL 一样,它简化了在其问题域(本例中为 HTTP 服务器)中创建解决方案的过程。它们是如何根据 DSL 进行思考的绝佳示例。如果您研究它们,您将能够很好地利用 DSL 进行思考。

关于Clojure "DSL"编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7712179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com