私はSquerylの設定を一般化しようとしています(Slickは同じ問題を引き起こします)。多くの一般的なメソッドに対して、すべてのケース クラスに明示的に名前を付ける必要は避けたいと考えています。
table[Person]
table[Bookmark]
etc.
これは、インデックスの生成、およびすべてのケース クラスの CRUD メソッドのラッパー メソッドの作成にも当てはまります。
理想的には、クラスのリストを作成してテーブルにし、インデックスを追加してラッパー メソッドを追加することです。
val listOfClasses = List(classOf[Person], classOf[Bookmark])
listOfClasses.foreach(clazz => {
val tbl = table[clazz]
tbl.id is indexed
etc.
})
値を型パラメーターとして持つことはできないと思うので、ここでは Scala マクロを適用すると思いました。また、フォームのすべてのタイプに対してメソッドを生成する必要があります。
def insert(model: Person): Person = persons.insert(model)
マクロの例については理解できましたが、一般的なデータ構造を生成する方法がわかりません。
私が欲しいものを説明するために、この簡単な例を手に入れました:
def makeList_impl(c: Context)(clazz: c.Expr[Class[_]]): c.Expr[Unit] = {
import c.universe._
reify {
println(List[clazz.splice]()) // ERROR: error: type splice is not a member of c.Expr[Class[_]]
}
}
def makeList(clazz: Class[_]): Unit = macro makeList_impl
どうすればいいですか?それとも、Scala Macros は間違ったツールですか?