OK、struct-mapを定義するClojureマクロを記述し、各フィールドの型を指定するよう呼び出し元に通知します。Clojureのマクロ - 引数から構成された名前を持つバインディングを定義します。
シグネチャは次のようになります。マップにある結合*category-meta*
を、作成もそれはstruct-map
というカテゴリを作成しますこれは何があるん
(defmodel category :id Integer :name String)
を、そして{:id Integer :name String}
ここで達成することが私のマクロですこれは:
(defmacro defmodel [name & field-spec]
`(let [fields# (take-nth 2 [email protected])]
(defstruct ~name fields#)
(def *~name-meta* (reduce #(assoc %1 (first %2) (last %2))) (partition 2 [email protected]))))
しかし、問題は、私は名前が構成されているバインディングを定義することはできません別の名前。基本的に(def *~name-meta* ...)
は動作しません。
これをどのように達成できますか?
ありがとうございました。
あなたの明確な答えをありがとう。前にdefrecordを見ましたが、主な欠点は、初期化時にすべてのフィールド値を指定する必要があることです。例えば、(defrecord category [^ String id^String name])、これを '(category。1"スタック ")'のように呼び出す必要があります。私は(category。{:id 1:name "Stack"})、(category。1)のようなことはできません。レコードのサポートのようなものは未だ暫定的で、いつでも変更される可能性があります。私が今までレコードについて知らなかったものを教えてください:) – EnToutCas
私はあなたが望むことを請負業者に書くことを検討します。記録はより速く、プロトコルを実装することができます。もっと強力なレコードがあります。https://github.com/david-mcneil/defrecord2 – nickik
@EnToutCas:暫定的なレコードサポートを呼び出すことはありません。実際には構造マップは廃止されました。交換を提案した。 (これは、工場の機能に関するいくつかの大会の可能性については何も言及していませんが、将来的にはコアライブラリに入り込む可能性があります。)あなたの特定の問題に関しては、私は基本的にnickikと合意しています。 (実際には、ほとんどすべてのレコードのファクトリ関数を書くことが有用であることを知っています。後でそれらを ':import'する必要がない場合は、すべてのレコードをインポートする必要があります)@nickik:リンクありがとう! –