2

Clojure は初めてで、Clojure を使用して他の言語のプログラミングを簡単にする方法を考えています。

私ができるようにしたいことの 1 つは、コード生成に 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 呼び出しに変換することもできます。

4

1 に答える 1

3

Clojure でテンプレートを作成するには、いくつかの選択肢があります。注目すべき場所の 1 つはClojure Toolboxです。

これは、 mustacheの小さなライブラリ (358 loc) 実装であるclostacheの例です。

(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);
}

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テキストを取り込むだけでなく、データ表現に解析します。

于 2014-04-29T02:42:48.790 に答える