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);
}
注意:我的最终目标是将这些作为System.Net.Http.HttpClient通过C#调用,但也可以将这些调用转换为JavaScript / Ajax调用
答案 0 :(得分:3)
使用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
不只是提取文本,还会将其解析为数据表示。