2011-07-13 1 views
4

私はclojureにジェネリックなserilization関数を書こうとしています。私はマップの特定のキーを必要としますが、私は避けたい何この入力マップを文字列にシリアル化する

(defn serialize [input-map] 
    (map #(str (% :Name) "," (% :Title) "\n") input-map)) 

があるん今のようにいくつかのものを持って

(serialize input-map ",") Produces 
Ashwani,Dev 

呼び出されたときに、この

(def input-map {:Name "Ashwani" :Title "Dev"}) 
(defn serialize [input-map delimiter] 
...rest of the code 
) 

のようなものそこにハードコーディングする名前とタイトル。これを達成するためにリフレクションや何かを使用するには何らかの方法が必要ですが、残念ながらこれを行うには十分なクロージャを知りません。

(require 'clojure.string) 
(defn serialize [m sep] (str (clojure.string/join sep (map (fn [[_ v]] v) m)) "\n")) 
(def input-map {:Name "Ashwani" :Title "Dev"}) 
(serialize input-map ",") 

利回り

"Ashwani,Dev\n" 

ない、これはですが、それはあなたのために働くべきか慣用確認:

+0

"serialize"の使い方がわかりません。一般に、serializeは出力からデータを再構築することを意味しますが、キーを保存することはまったくありません。また、関数を汎用的にするが、キー自体を出力しない場合は、出力順を制御できるように関数にキーを提供する必要があります。 –

+0

@Alex - 私が必要としていることは、過ちからの答えです。私が書いた質問は、私が達成したいことを明確にdemostrateします。あなたは "Serliaze"の単語に問題がある場合、それを "Foo"と呼ぶことができます。 – Ash

+0

私の謝罪、私の前のコメントは、明らかに私の一般的な失敗である過度に重大であった。あなたが必要としている答えを得られなかった場合に備えて、より明確な質問を促すのを私の意向でした。あなたが必要なものを手に入れれば、それは素晴らしいものです。 –

答えて

0

は「ノーマル」ClojureのタイプはPR-STR使ってシリアライズすることができ、読み文字列を使用して再instated :)ことを逃す可能性がどのようにvals ...。あなたが記述した特定の方法でシリアル化されたデータをフォーマットする理由がない限り、その出力がより読みやすいので、代わりにpr-strを使用することをお勧めします。

+0

私は地図のリストを持っています。私はそれらの値を取得してCSVファイルに書きたいので、上記の方法が必要ですが、defstructに適用すると、今のところエラーが出ます。 – Ash

5
(defn serialize [m sep] (apply str (concat (interpose sep (vals m)) ["\n"]))) 
2

終了しました。

(str input-map) 
関連する問題