【问题标题】:Clojure EDN as a Code Generation Metadata sourceClojure EDN 作为代码生成元数据源
【发布时间】:2014-06-14 08:04:22
【问题描述】:

Clojure 新手,想知道如何使用它来让我用其他语言更轻松地编写程序。

我想做的一件事是使用 Clojure 进行代码生成。

例如,给定来自数据文件(EDN 格式)的输入,我应该如何 (1) 遍历此结构或 (2) 将数据推送到现有的模板机制中?

下面的数据将用于定义简单的 REST API,以便您可以从中生成客户端。使用不同的模板生成多种语言的客户端。

(:restcall "GetAccountBalance" 
  {:method "GET" :path "account/balance"}
  {:id int})

(:restcall "GetLastTransactions" 
  {:method "GET" :path "account/transactions"}
  {:page int})

生成的代码类似于

public void GetAccountBalance(int id) 
{
    var input = new { id = id };
    callIntoRestLibrary("GET", "account/balance", input);
}

public void GetLastTransactions(int page) 
{
    var input = new { page = page };
    callIntoRestLibrary("GET", "account/transactions", input);
}

注意:我的最终目标是通过 C# 将这些作为 System.Net.Http.HttpClient 调用,但也能够将它们转换为 JavaScript/Ajax 调用

【问题讨论】:

  • 你能举例说明你想得到什么输出吗?也许我们可以举例说明如何实现它。
  • 我不确定我是否正确收到了您的消息,但您所做的与this 非常相似
  • 我把问题简化了一点。所以现在,假设我没有返回任何数据(我的方法现在将返回 void)。更新的问题。
  • 你在问什么:(A)如何使用 Clojure 创建另一种语言的代码文本表示? (B) 如何使用 Clojure 编译代码与 Java/CLR 互操作? (C) 如何在 Clojure 中做 REST,例如与 Compojure? (D) 以上都不是
  • A.韦伯,我正在尝试做(A)。在浏览数据结构时尝试在 Clojure 中找到字符串连接/构建/模板的惯用方式。或者是否有内置的类似 XSLT 的方法。

标签: templates clojure code-generation edn


【解决方案1】:

您有多种使用 Clojure 进行模板化的选择。一个可以查看的地方是Clojure Toolbox

这里是clostache 的示例,mustache 的小型库(358 位)实现。

(ns so.core
  (:require [clostache.parser :refer (render)]))

(def template "
public void {{restcall}}({{id}} id) 
{
    var input = new { id = id };
    callIntoRestLibrary(\"{{method}}\", \"{{path}}\", input);
}")

(def data 
  {:restcall "GetAccountBalance" 
   :method "GET" :path "account/balance" :id "int"})


(print (render template data))

输出:

public void GetAccountBalance(int id)
{
    var input = new { id = id };
    callIntoRestLibrary("GET", "account/balance", input);
}

消除对read EDN 含义的困惑。

(spit "foo.txt" (prn-str data))

现在文件foo.txt 包含data 的文本表示,大概是您的起点。

(def data2 (with-open [r (java.io.PushbackReader. (java.io.FileReader. "foo.txt"))] 
             (clojure.edn/read r)))

(= data data2) ;=> true

所以,read 不只是拉入文本,还会将其解析为数据表示形式。

【讨论】:

  • 谢谢。对于我的问题的 EDN 部分......我如何从文件中读取数据变量并将其视为 s 表达式而不是字符串?最终我希望能够将 Clojure 代码指向模板文件和数据文件。
  • @BuddyJoe 当你从带有clojure.edn/read的文件中读取EDN时,例如,它读取,而这里的“读取”也意味着解析成数据表示。
  • 太棒了。这确实澄清了我对使用 EDN 的理解。谢谢。 +1 并回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多