1

さらに仮説的な質問です。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)

これが楽園型マクロの目的ですか?

もしそうなら、なぜ型マクロの開発を止めたいと思う人がいるでしょうか?

4

1 に答える 1