さらに仮説的な質問です。Scala マクロを使用して、次のような構造を変更することは可能ですか。
object Foo extends Factory { // Factory = expansion magic
trait Config {
val i: Int = 33
val s: String = "foo"
}
def apply(c: Config): Foo = ???
}
trait Foo
(多かれ少なかれ自動的に)これに:
object Foo {
sealed trait ConfigLike {
def i: Int
def s: String
}
object Config {
def apply() = new ConfigBuilder
implicit def build(b: ConfigBuilder) = b.build
}
final case class Config(i: Int, s: String) extends ConfigLike
object ConfigBuilder {
def apply(c: Config) = {
val b = new ConfigBuilder
b.read(c)
b
}
}
final class ConfigBuilder extends ConfigLike {
var i: Int = 33
var s: String = "foo"
def build: Config = Config(i, s)
def read(c: Config) {
i = c.i
s = c.s
}
}
def apply(c: Config = Config()): Foo = ???
}
使用事例:
val c = Foo.Config()
c.i = 44
c.s = "bar"
val f = Foo(c)
これが楽園型マクロの目的ですか?
もしそうなら、なぜ型マクロの開発を止めたいと思う人がいるでしょうか?