I hereby claim:
- I am xeno-by on github.
- I am xeno_by (https://keybase.io/xeno_by) on keybase.
- I have a public key whose fingerprint is FE5A 8474 50B9 0939 A0A5 6C10 E512 F2A2 36EE 59D9
To claim this, I am signing this object:
I hereby claim:
To claim this, I am signing this object:
| // PROBLEM STATEMENT | |
| // Let's build Proxy[T], an object that can capture calls to methods of an underlying object. | |
| // We want the proxy to be type-safe, i.e. we need to verify that the names of the calls | |
| // and the arguments that are passed to those calls are well-typed wrt the type of the proxee. | |
| object Test extends App { | |
| trait Foo { /* ... */ } | |
| val proxy: Proxy[Foo] = ??? | |
| proxy.bar() |
| import scala.reflect.macros.whitebox._ | |
| import scala.language.experimental.macros | |
| object Macros { | |
| def impl(c: Context)(fn: c.Tree) = { | |
| import c.universe._ | |
| val Typed(Block(List(ClassDef(_, _, _, Template(_, _, stats))), _), _) = fn | |
| val List(_, DefDef(_, TermName("applyOrElse"), _, _, _, Match(_, clauses :+ _)), _) = stats | |
| val pfs = clauses.map(clause => { | |
| object betterUntypecheck extends Transformer { |
| object Test extends App { | |
| trait Term | |
| class If extends Term | |
| trait AllowedTransformation[I, O] | |
| implicit object term2Term extends AllowedTransformation[Term, Term] | |
| class Foo[T] { | |
| def filter[U <: T : scala.reflect.ClassTag](f: PartialFunction[U, Boolean]): Foo[U] = { | |
| println(scala.reflect.classTag[U]) |
| 14:58 ~/Projects/211x/sandbox (2.11.x)$ cat Macros.scala | |
| import scala.reflect.macros.whitebox._ | |
| import scala.language.experimental.macros | |
| object Macros { | |
| def macroImpl[T: c.WeakTypeTag](c: Context) = { | |
| import c.universe._ | |
| val tpe = weakTypeTag[T].tpe | |
| implicit class RichType(tpe: Type) { | |
| def pre: Type = tpe match { |
| [INFO] --- scala-maven-plugin:3.1.7-SNAPSHOT:compile (scala-compile-first) @ scala --- | |
| [WARNING] Zinc server is not available at port 3030 - reverting to normal incremental compile | |
| [INFO] Using incremental compilation | |
| [WARNING] extra args for zinc are ignored in non-server mode | |
| [INFO] 'compiler-interface' not yet compiled for Scala 2.11.2. Compiling... | |
| /var/folders/bq/rz89jq0x4f13cm4sk6ss08l80000gn/T/sbt_3f3e9cfe/CompilerInterface.scala:246: error: recursive method rootLoader needs result type | |
| override def rootLoader = if(resident) newPackageLoaderCompat(rootLoader)(compiler.classPath) else super.rootLoader | |
| ^ | |
| /var/folders/bq/rz89jq0x4f13cm4sk6ss08l80000gn/T/sbt_3f3e9cfe/CompilerInterface.scala:246: error: value rootLoader is not a member of scala.tools.nsc.backend.JavaPlatform | |
| override def rootLoader = if(resident) newPackageLoaderCompat(rootLoader)(compiler.classPath) else super.rootLoader |
| 11:42 ~/Projects/211x/sandbox (2.11.x)$ cat Test.scala | |
| import scala.reflect.runtime.universe._ | |
| import scala.reflect.runtime.{currentMirror => cm} | |
| import scala.tools.reflect.ToolBox | |
| import scala.tools.reflect.Eval | |
| object Test extends App { | |
| val tb = cm.mkToolBox(options = "-Ydump-classes .") | |
| println(tb.eval(q"123")) | |
| } |
| @clean | |
| def foo = bar | |
| // expands into | |
| def foo = WartRemover.clean(bar) |
| class ReflectTypechecker { self => | |
| type UnaffiliatedMacroContext <: scala.reflect.moved.macros.contexts.Context | |
| type MacroContext = UnaffiliatedMacroContext { val universe: self.global.type } | |
| def newContext(): MacroContext = new ReflectMacroContext().asInstanceOf[MacroContext] | |
| } | |
| class CompilerTypechecker extends ReflectTypechecker { | |
| override type UnaffiliatedMacroContext = scala.reflect.macros.contexts.Context | |
| override def newContext(): MacroContext = new CompilerMacroContext().asInstanceOf[MacroContext] | |
| } |
| class ReflectCompilationUnit { | |
| type Icode | |
| def icodes: List[Icode] = Nil | |
| } | |
| class CompilerCompilationUnit extends ReflectCompilationUnit { | |
| type Icode = compiler.Icode | |
| override val icodes: List[Icode] = ... | |
| } |