Skip to content

Instantly share code, notes, and snippets.

@matsu-chara
Last active August 29, 2015 14:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save matsu-chara/e34bc9b03674a20c9f41 to your computer and use it in GitHub Desktop.
Save matsu-chara/e34bc9b03674a20c9f41 to your computer and use it in GitHub Desktop.
TypeDynamicの練習
name := "TypeDynamic"
version := "1.0"
scalaVersion := "2.11.6"
libraryDependencies += "org.scala-lang" % "scala-reflect" % scalaVersion.value
package TypeDynamic
import scala.language.experimental.macros
import scala.reflect.macros.whitebox
import scala.reflect.macros.whitebox.Context
object TypeDynamic {
class Example() extends Dynamic {
val value: Int = 2
def selectDynamic(name: String): Int = macro selectDynamicImpl
}
def selectDynamicImpl(c: whitebox.Context)(name: c.Expr[String]): c.Expr[Int] = {
import c.universe._
val nameStr: String = name.tree match {
case pq"${n: String}" if n.startsWith("_") => n.drop(1)
case _ => c.abort(c.enclosingPosition, s"#$name not found.")
}
c.Expr[Int](q"${c.prefix}.${TermName(nameStr)}")
}
}
package TypeDynamic
import TypeDynamic._
object TypeDynamicTest {
def main(args: Array[String]): Unit = {
val e = new Example()
println(e._value)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment