gpt4 book ai didi

templates - Clojure EDN 作为代码生成元数据源

转载 作者:行者123 更新时间:2023-12-05 04:17:20 25 4
gpt4 key购买 nike

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 调用

最佳答案

使用 Clojure 进行模板化有多种选择。一个值得一看的地方是 Clojure Toolbox .

这是一个 clostache 的例子, mustache 的小型库(358 loc)实现.

(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 不仅会提取文本,还会将其解析为数据表示形式。

关于templates - Clojure EDN 作为代码生成元数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23346795/

25 4 0